我的双向 JPA OneToMany 映射感觉很奇怪

Strange feeling with my bi-directional JPA OneToMany mapping

我有两个实体,UserRole,它们应该在双向 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可以属于多个用户。您需要在 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;

} 

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