2013-12-22 195 views
0

由於2H我試圖想出以下問題的解決方案,我只是找不到一個適當的方式做到這一點:多對多關係,刪除記錄從關係表

我有三個表在MySQL數據庫:

角色 [ROLE_ID] [ROLE_NAME]

權限 [permission_id] [PERMISSION_NAME]

PermissionToRole [permission_id] [ROLE_ID]

我的角色類的關係的所有者:

@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
@JoinTable(name="permissiontorole", 
      joinColumns={@JoinColumn(name="role_id")}, 
      inverseJoinColumns={@JoinColumn(name="permission_id")}) 

權限類映射定義爲:

@ManyToMany(mappedBy="permissions") 
private Set<UserRole> userRoles = new HashSet<UserRole>(); 

現在,當我刪除任何權限或角色的相應記錄(這是預期的和期望的),但是這種關係仍然存在於PermissionToRole表中,並且我不知道如何在刪除角色或權限記錄時刪除該關係。當我將級聯類型更改爲ALL時,那麼當我刪除角色或權限時,關係將被刪除,但其他記錄也是如此。如果我刪除角色權限也被刪除。

任何想法如何處理它?

回答

2

您只需從Role.permissions集合中刪除權限,刪除角色和權限之間的關聯:

for (UserRole role: permissionToDelete.getUserRoles()) { 
    role.getPermissions().remove(permissionToDelete); 
} 
em.remove(permissionToDelete); 
+0

是啊,這工作,但同時,我也發現了其他的解決方案,我不知道哪一個是更好。我使用delate action = cascade在表中設置了外鍵,那也沒有額外的代碼做這項工作,所以哪一個更好,爲什麼?很顯然,一方面我的解決方案中的代碼更少,但另一方面它爲DB增加了額外的複雜性 – Stugal

+0

通常,當您刪除角色仍然引用的權限時,您希望引發異常,因爲這意味着您可能忘記了一些東西。由於級聯的緣故,盲目地刪除權限及其與角色的關聯允許刪除權限,甚至不檢查角色是否仍然引用它,這可能是一個問題。 –

+0

是的你說得對。我還有一個問題,爲了更新UserRole記錄(添加額外的權限),我首先需要將它從數據庫中提取出來並將新的權限添加到列表中?還是有更好/更快的方式? – Stugal