我的双向 JPA OneToMany 映射感觉很奇怪
Strange feeling with my bi-directional JPA OneToMany mapping
我有两个实体,User
和 Role
,它们应该在双向 Role
到许多 User
.
中相关
用户class:
@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);
}
}
}
角色class:
@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.");
}
到目前为止一切都很好,我没有发现异常,但不知何故我觉得有些冗余。我想知道如果我在 Role
中的 List<User>
中始终只存储一个用户会怎样?还是我偏执,这段代码没问题?
User
可以有多个角色,一个Role
可以属于多个用户。您需要在 User
和 Role
之间建立 @ManyToMany
关联。 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;
}
您似乎正在为每个新用户创建一个名称为 "user" 的新角色,而不是重复使用当前的 "user" 角色。每个 "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.");
}
我有两个实体,User
和 Role
,它们应该在双向 Role
到许多 User
.
用户class:
@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);
}
}
}
角色class:
@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.");
}
到目前为止一切都很好,我没有发现异常,但不知何故我觉得有些冗余。我想知道如果我在 Role
中的 List<User>
中始终只存储一个用户会怎样?还是我偏执,这段代码没问题?
User
可以有多个角色,一个Role
可以属于多个用户。您需要在 User
和 Role
之间建立 @ManyToMany
关联。 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;
}
您似乎正在为每个新用户创建一个名称为 "user" 的新角色,而不是重复使用当前的 "user" 角色。每个 "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.");
}