2017-05-08 110 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); 
相關問題