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.");
    }