有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用双向JPA-OneToMany映射的奇怪感觉

我有两个实体,UserRole,它们应该以一个双向的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中存储一个用户会发生什么?还是我有点偏执,而这代码很好


共 (2) 个答案

  1. # 1 楼答案

    似乎您正在为每个新用户创建一个名为“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.");
        }
    
  2. # 2 楼答案

    User可以有多个角色,一个Role可以属于多个用户。在UserRole之间需要有@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;
    
    }