Java 我的双向JPA OneToMany映射有一种奇怪的感觉
我有两个实体,Java 我的双向JPA OneToMany映射有一种奇怪的感觉,java,hibernate,jpa,hibernate-mapping,Java,Hibernate,Jpa,Hibernate Mapping,我有两个实体,用户和角色,这两个实体应该与许多用户双向关联 用户类别: @Entity public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long userId; ... @ManyTo
用户
和角色
,这两个实体应该与许多用户
双向关联
用户类别:
@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);
}
}
到目前为止,一切都很好,我也没有例外,但不知何故,我有一种感觉,有一些冗余。我想知道如果我总是在
角色的列表中存储一个用户会发生什么?还是我有妄想症,这个代码还可以?用户可以有多个角色,一个角色可以属于多个用户。您需要在用户
和角色
之间建立@manytomy
关联<代码>角色
类似于参考值,因此它不应该存储关联的用户
@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;
}
@实体
@桌子
公共类用户{
@身份证
@生成值
私人长pid;
@ManyToMany(fetch=FetchType.LAZY)
私有列表角色;
}
@实体
@桌子
公共阶级角色{
@身份证
私人长pid;
@纵队
私有字符串名称;
}
似乎您正在为每个新用户创建一个名为“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.");
}
您有点偏执,映射或示例代码没有问题。在大多数情况下,用户和角色有多对多的关系,但如果您的业务需求是每个用户只有一个角色,而不是更多的一对多,则应该可以。我不认为我会将用户添加到角色中。我只想给一个用户分配一个角色。@Shire居民:你肯定是对的。为简单起见(?)我试着把它作为一个“一个女人”关系的第一步,但我会改变这一点。见鬼,这看起来比“一个女人”更简单。如前所述,我想我会改变的。@Martin谢谢你们的投票。我更新了一些新的想法,现在我尝试了很多,效果非常好(仅用于测试):Role-Role=new-Role();role.setRoleName(“用户”);Role role2=新角色();role2.setRoleName(“管理”);列表角色=新的ArrayList();角色。添加(角色);角色。添加(角色2);newUser.setRoles(角色);em.persist(newUser)@Martin请记住,@manytomy
使用了一个额外的联接表。您需要创建角色,然后找到角色并添加到用户。类似于@masahud的回答。您可以对其使用enum
:RoleEnum(用户,管理员)
。由于角色通常预先插入到数据库中,因此不需要if(role==null)块
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.");
}