具有多对多关系的级联删除[重复]

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 必须检查每条记录是否在另一个表中有关系,这是不可能的。

以上是关于具有多对多关系的级联删除[重复]的主要内容,如果未能解决你的问题,请参考以下文章

hibernate多对多双向关系映射的级联配置

同一张表之间多对多的级联删除

没有级联删除目标的级联删除关系

15.翻译系列:EF 6中的级联删除EF 6 Code-First 系列

Mybatis 多对多(易百教程)

hibernate 级联删除