2017-05-08 85 views
1

在我的项目中,我有一个用户实体和一个UserRole实体。 根据我的数据库设计,用户可以扮演多个角色,角色可以与多个用户相关联。我在系统中的用户角色是USER和ADMIN。用户,UserRole的数据库设计 - 多对多关系

需要将用户角色存储在表中,并且需要在用户保留在相关表中时引用它们。

但是,根据我实现的代码,每次将用户插入数据库时​​,记录都会插入到用户角色表中。我需要的是将数据插入到用户表和连接表中。

这些是我的实体。

用户:

@Entity 
@Table(name="user") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false, updatable= false) 
    private Long id; 

    @Column(name = "email", nullable = false, unique = true) 
    private String email; 

    @Column(name = "first_name", nullable = false) 
    private String firstName; 

    @Column(name = "last_name", nullable = false) 
    private String lastName; 

    @Column(name = "password_hash", nullable = false) 
    private String passwordHash; 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name = "user_with_role", 
      joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, 
      inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")}) 
    private List<UserRole> roles; 

} 

的UserRole:

@Entity 
@Table(name = "userrole") 
public class UserRole { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false, updatable= false) 
    private long id; 

    @Column(name = "role_name") 
    @NotNull 
    @Enumerated(EnumType.STRING) 
    private Role roleName; 

    @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) 
    private List<User> users; 
} 

这是我坚持用户数据库。

List<UserRole> roles = new ArrayList<>(); 

UserRole ur_user = new UserRole(); 
ur_user.setRoleName(Role.USER); 

UserRole ur_admin = new UserRole(); 
ur_user.setRoleName(Role.ADMIN); 

roles.add(ur_user); 
roles.add(ur_admin); 

newUser.setRoles(roles); 
entityManager.persist(newUser); 

entityManager.flush(); 

这种机制适用于相关应与父实体一起输入数据库的情况。 (例如:联系人员数量)

在我的情况下,我真的不明白我应该编写代码的方式,以便在持久保留用户时不会插入到UserRole表中。

如何在我的情况下编写代码。 另外,我想知道我应该在用户实体中使用CascadeType。我已经把CascadeType.ALL,但我知道这不是根据上下文在那个地方最好的类型。

回答

1

那么关于@ManyToMany你应该肯定是非常caucios约CascadeType.REMOVE所以我将其定义为CascadeType.PERSIST, CascadeType.MERGE

现在,您可以保留映射的其余部分,因为它们都很好。 为了不保存角色,您必须先查询它们,而不是像您一样手动创建它们。对于持久性来说,只是提供了一些新的非托管实体,并试图在提交时坚持它们。

下面的示例使用已经存在的UserRole's和感谢的优势,只有User被持久(使用已经存在的依赖):

UserRole ur_user = entityManager.getRoleByType(Role.USER); 
UserRole ur_admin = entityManager.getRoleByType(Role.ADMIN); 

roles.add(ur_user); 
roles.add(ur_admin); 

newUser.setRoles(roles); 
entityManager.persist(newUser); 
相关问题