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时,那么当我删除角色或权限时,关系将被删除,但其他记录也是如此。如果我删除角色权限也被删除。
任何想法如何处理它?
是啊,这工作,但同时,我也发现了其他的解决方案,我不知道哪一个是更好。我使用delate action = cascade在表中设置了外键,那也没有额外的代码做这项工作,所以哪一个更好,为什么?很显然,一方面我的解决方案中的代码更少,但另一方面它为DB增加了额外的复杂性 – Stugal
通常,当您删除角色仍然引用的权限时,您希望引发异常,因为这意味着您可能忘记了一些东西。由于级联的缘故,盲目地删除权限及其与角色的关联允许删除权限,甚至不检查角色是否仍然引用它,这可能是一个问题。 –
是的你说得对。我还有一个问题,为了更新UserRole记录(添加额外的权限),我首先需要将它从数据库中提取出来并将新的权限添加到列表中?还是有更好/更快的方式? – Stugal