我的双向JPA OneToMany映射感到奇怪

时间:2016-04-05 14:05:07

标签: java hibernate jpa hibernate-mapping

我有两个实体,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);
        }
    }

最后,我尝试以这种方式在我的signUp-method中设置这些实体:

    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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

User可以有多个角色,一个Role可以属于多个用户。您需要在@ManyToManyUser之间建立Role关联。 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;

}