java使用双向JPA-OneToMany映射的奇怪感觉
我有两个实体,User
和Role
,它们应该以一个双向的Role
与多个User
相关联
用户类别:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
...
@ManyToOne
private Role role;
...
public void setRole(Role role) {
this.role = role;
if (!role.getUsers().contains(this)) {
role.getUsers().add(this);
}
}
}
角色类:
@Entity
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long roleId;
private String roleName;
@OneToMany(mappedBy = "role")
private List<User> users = new ArrayList<>();
...
public void addUser(User user) {
users.add(user);
if (user.getRole() != this) {
user.setRole(this);
}
}
最后,我尝试以这种方式在注册方法中设置这些实体:
try {
em.persist(newUser);
} catch (Exception e) {
throw new Exception("Could not persist user.");
}
Role role = new Role();
role.setRoleName("user");
role.addUser(newUser);
try {
em.persist(role);
} catch (Exception e) {
throw new Exception("Could not persist role.");
}
到目前为止,一切都很好,我也没有例外,但不知何故,我有一种感觉,有一些冗余。我想知道如果我总是只在List<User>
中的Role
中存储一个用户会发生什么?还是我有点偏执,而这代码很好
# 1 楼答案
似乎您正在为每个新用户创建一个名为“user”的新角色,而不是重用当前的“user”角色。每个“用户”角色只有一个用户
您应该尝试按名称查找角色,而不是总是创建新角色
# 2 楼答案
User
可以有多个角色,一个Role
可以属于多个用户。在User
和Role
之间需要有@ManyToMany
关联Role
类似于参考值,所以它不应该存储关联的用户