1. user 主控方
@Getter
@Setter
@Entity
@Table(name = "t_user")
@NoArgsConstructor
public class User {
@Id
private Long id;
private String username;
public User(Long id, String username) {
this.id = id;
this.username = username;
}
/**
* 所属的角色
*/
@ManyToMany
@JoinTable(name = "mt_user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
}
2. role ,不控制关联关系。
@Getter
@Setter
@Entity
@Table(name = "t_role")
@NoArgsConstructor
public class Role {
@Id
private Long id;
private String roleName;
public Role(Long id, String roleName) {
this.id = id;
this.roleName = roleName;
}
/**
* 角色所包含的用户
*/
@ManyToMany(mappedBy = "roles")
private Set<User> users = new HashSet<>();
}
3.初始化数据
Role role1 = new Role(1L, "role1");
Role role2 = new Role(2L, "role2");
Role role3 = new Role(3L, "role3");
this.roleRepository.save(role1);
this.roleRepository.save(role2);
this.roleRepository.save(role3);
User user1 = new User(1L, "user1");
User user2 = new User(2L, "user2");
User user3 = new User(3L, "user3");
this.userRepository.save(user1);
this.userRepository.save(user2);
this.userRepository.save(user3);
4.建立关联关系--新增
在主控方加入即可,此时 user 和 role 都是受管状态。
(1)user是主控方,会在关联表中加入数据记录。
User user = this.userRepository.findById(1L).orElse(null);
Role role = this.roleRepository.findById(1L).orElse(null);
user.getRoles().add(role);
(2)role不是主控方,关联表中不会加入数据记录。
User user = this.userRepository.findById(1L).orElse(null);
Role role = this.roleRepository.findById(1L).orElse(null);
role.getUsers().add(user);
5. 建立关联关系--删除
这样会删除user和role之间的关联关系。
User user = this.userRepository.findById(1L).orElse(null);
(1)user.getRoles().removeAll(user.getRoles()); 推荐
(2)user.setRoles(Collections.EMPTY_SET);
(3)user.setRoles(null);
(4)user.setRoles(new HashSet<>()); 或 user.setRoles(new LinkedHashSet<>()); 根据需要而定;推荐
推荐的两种做法在删除之后可以接着 插入 新的关联关系,即更新关联关系;(2)和(3)再插入会失败。
6.删除实体
User user = this.userRepository.findById(1L).orElse(null);
this.userRepository.delete(user);
会将user 及 user 和 role之间的关联关系一起删除。
若是如下,由于role不是主控方,则会报错:
Role role = this.roleRepository.findById(1L).orElse(null);
this.roleRepository.delete(role);
7. 更新关联关系
User user = this.userRepository.findById(1L).orElse(null);
user.setRoles(new HashSet<>()); // 或者user.getRoles().removeAll(user.getRoles());
Role role3 = this.roleRepository.findById(3L).orElse(null);
user.getRoles().add(role3);