【问题标题】: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;

 }

【问题讨论】:

标签: java mysql hibernate jpa


【解决方案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 必须检查每条记录是否在另一个表中有关系,这是不可能的。
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多