2013-12-22 99 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