欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

十五、SpringDataJPA属性表关联映射

时间:2023-07-30
十五、Spring Data JPA 属性表关联映射

(一)、多对一

1.映射关系创建2.测试 (二)、多对多

1.表关系创建2.测试 (一)、多对一

示例:一个用户(User)只能有一个角色(Role),一个角色(Role)可以对应多个用户(User),User 表通过role_id和 Role 表的id相关联。

1.映射关系创建

@ManyToOne:表对应关系;
mapperBy:在关联表中的映射;@JoinColumn:当前表与其它表关联的外键;
name:外键名称。

注:

重写toString方法不要造成死循环;项目配置文件中添加配置,开启懒加载:

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

表 User:... @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @ManyToOne @JoinColumn(name = "role_id") private Role role; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + ''' + ", age=" + age + ", sex='" + sex + ''' + ", role=" + role.getRole_name() + '}'; } ...}

表 Role:... @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @OneToMany(mappedBy = "role") private Set users = new HashSet<>(); @Override public String toString() { return "Role{" + "id=" + id + ", role_name='" + role_name + ''' + '}'; } ...}

2.测试

... @Autowired private UserRepository userRepository;@Test void testOneToMany(){ List roles = new ArrayList<>(); Role role = new Role(); role.setRole_name("管理员"); roles.add(role); Role role1 = new Role(); role1.setRole_name("VIP会员"); roles.add(role1); Role role2 = new Role(); role2.setRole_name("会员"); roles.add(role2); System.out.println("一对多:"); List users = userRepository.findAll(); for (User user : users) { System.out.println(user.toString()); int i = user.getId() % 2 == 0 ? 1 : (user.getId() % 3 == 0 ? 2 : 0); user.setRole(roles.get(i)); userRepository.save(user); } System.out.println("一对多更新:"); List users2 = userRepository.findAll(); for (User user : users2) { System.out.println(user); } } ...

(二)、多对多

示列:*一个User对应可能对应多个Menu,一个Menu也可能对应多个User,两个表都通过id相关联。

1.表关系创建

@ManyToMany(表间关系)
cascade(级联操作)详情见:资料1,资料2
     CascadeType.ALL:级联所有实体状态转换;
     CascadeType.PERSIST:持久化,级联保存;
     CascadeType.MERGE:级联实体合并操作;
     CascadeType.REMOVE:级联实体删除操作;
     CascadeType.REFRESH:级联实体刷新操作;
     CascadeType.DETACH:级联实体分离操作;
mapperBy:映射字段(关联表字段);@JoinTable(中间表)
name:中间表名称(名称任意);
joinColumns(当前表与中间表关联字段信息)
     name:中间表与当前表关联的字段(任意定义);
     referencedColumnName:当前表与中间表关联的字段(当前表中的字段)
inverseJoinColumns:关联表与中间表关联字段信息。

表 Role:... @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "role_menu", joinColumns = {@JoinColumn(name = "role_id",referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "menu_id", referencedColumnName = "id")}) private Set

menus = new HashSet<>();...

表 menu:... @ManyToMany(mappedBy = "menus") private Set roles = new HashSet<>(); @Override public String toString() { return "Menu{" + "id=" + id + ", Work='" + Work + '}'; }...

2.测试

... @Autowired private RoleRepository roleRepository; @Autowired private MenuRepository menuRepository; @Test void testManyToMany() { Menu menu0 = new Menu(); menu0.setWork("学习" ); Menu menu1 = new Menu(); menu1.setWork("看书"); Menu menu2 = new Menu(); menu2.setWork("打游戏"); System.out.println("多对多查询 Role:"); List roles = roleRepository.findAll(); for (Role role : roles) { System.out.println(role.toString()); Set

menus = new HashSet(); menus.add( role.getId() % 2 == 0 ? menu0 : (role.getId() % 3 == 0 ? menu1 : menu2)); role.setMenus(menus); roleRepository.save(role); } System.out.println("多多多查询 Role:"); List roles = roleRepository.findAll(); for (Role role : roles) { System.out.println(role); } System.out.println("多对多查询 Menu:"); List menus = menuRepository.findAll(); for (Menu menu : menus) { System.out.println(menu); } } ...

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。