具有多对多关系的级联删除[重复]
Posted
技术标签:
【中文标题】具有多对多关系的级联删除[重复]【英文标题】:cascade delete with ManyToMany relation [duplicate] 【发布时间】:2016-05-10 21:14:06 【问题描述】:我有以下实体。我希望能够删除一个用户,并且 UserGroupMap 中包含该用户的任何条目也应该被删除。但是,每次我尝试删除在 UserGroupMap 中也有条目的用户时,我都会收到以下错误。无法删除或更新父行:外键约束失败我该如何实现这种行为? p>
@Entity
public class User
@Id
private Long id;
@Column
private String name;
@ManyToMany(mappedBy = "users", cascade = CascadeType.All)
private Set<Group> groups;
@Entity
public class Group
@Id
private Long id;
@Column
private String type;
@ManyToMany
@JoinTable(name = "UserGroupMap",
joinColumns = @JoinColumn(name = "groupId", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "userId", referencedColumnName = "id") )
private Set<User> users;
【问题讨论】:
可能重复 - ***.com/q/1082095/5516322 【参考方案1】:您应该将 (cascade=CascadeType.REMOVE) 添加到您的多对多关系中
喜欢这个例子
@ManyToMany(cascade=CascadeType.REMOVE)
【讨论】:
ManyToMany 没有 orphanRemoval【参考方案2】:根据我对实体的了解,Group
不应被删除,User
属于 Group
。
这意味着Group
实体是父端。
移除User
时,您需要将其从Group
一侧移除。
在Group
实体上创建一个名为“remove”的方法,该方法采用User
参数,即您要删除的用户。
public void remove(User user)
for(Iterator<User> iterator = users.iterator(); iterator.hasNext();)
User removeUser = iterator.next();
/*
* you can check here if the user is equal to the parameter user
* if equal remove
*/
if(removeUser.equal(user))
removeUser.setGroup(null);
iterator.remove();
【讨论】:
【参考方案3】:@Entity
public class User
@Id
private Long id;
@Column
private String name;
@ManyToMany(mappedBy = "users", cascade = CascadeType.All, orphanRemoval=true)
private Set<Group> groups;
orphanRemoval 选项应该处理子元素的删除
【讨论】:
ManyToMany 没有 orphanRemoval 如果您使用的是休眠,那么@OnDelete 操作将对您有用。 docs.jboss.org/hibernate/stable/annotations/api/org/hibernate/…@OnDelete(action=OnDeleteAction.CASCADE) 就像@kittels 说的那样,在 manytomany 中没有 orphanRemoval,因为 hibernate 必须检查每条记录是否在另一个表中有关系,这是不可能的。以上是关于具有多对多关系的级联删除[重复]的主要内容,如果未能解决你的问题,请参考以下文章