我有两个实体,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);
}
}
最后,我尝试以这种方式在我的signUp-method中设置这些实体:
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
中存储一位用户会怎么样?或者我是偏执狂,这段代码很好吗?
答案 0 :(得分:2)
您似乎正在为每个新用户创建名为“user”的新角色,而不是重用当前的“用户”角色。每个“用户”角色只有一个用户。
您应该尝试按名称查找角色,而不是始终创建新角色。
Role role = findRoleByName("user");
if (role == null) {
role = new Role();
role.setRoleName("user");
}
role.addUser(newUser);
try {
em.persist(role);
} catch (Exception e) {
throw new Exception("Could not persist role.");
}
答案 1 :(得分:1)
User
可以有多个角色,一个Role
可以属于多个用户。您需要在@ManyToMany
和User
之间建立Role
关联。 Role
类似于参考价值,因此它不应存储关联用户。
@Entity
@Table
public class User {
@Id
@GeneratedValue
private Long pid;
@ManyToMany(fetch = FetchType.LAZY)
private List<Role> roles;
}
@Entity
@Table
public class Role {
@Id
private Long pid;
@Column
private String name;
}