(一)、多对一
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
表 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 


