Hibernate删除查询的顺序

4

这是我的数据模型(简化版),

public class AddressBook {
    private List<Group> groups = new ArrayList<Group>();
    private List<People> peoples = new ArrayList<People>();

    @OneToMany(mappedBy = "addressbook", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    public List<Group> getGroups() {
        return groups;
    }

    @OneToMany(mappedBy = "addressbook", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    public List<People> getPeoples() {
        return peoples;
    }
}


public class Group {
    private AddressBook addressBook;


    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    public void setAddressBook(AddressBook addressBook) {
        this.addressBook = addressBook;
    }
}

public class People {
    private AddressBook addressBook;
    private Group group;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    public AddressBook getAddressBook() {
        return addressBook;
    }
    public Group getGroup() {
        return group;
    }
}

我想从我的通讯录中删除一个完整的分组,以及属于该组的所有联系人。因此我会执行以下操作:
adressBook.getPeople().removeAll(peopleBelongingToGroupA);
adressBook.getGroups().remove(groupA);

但是当我的事务提交时,Hibernate 首先会执行以下操作:
delete from groups where groupName='groupA';

不要先删除人员。这会导致我的“people”和“group”之间的FOREIGN_KEY约束被违反。

有没有办法告诉Hibernate先删除人员,然后再删除组?我的模型有什么缺陷吗?

3个回答

2
您尝试过在每个@ManyToOne上设置级联吗?您只在AddressBook中指定了删除级联,这个属性应该是针对每个关联的。编写这些bean时,有EJB3.0规范非常值得参考。请参见http://jcp.org/en/jsr/detail?id=220 更新:再次阅读您的数据模型,可能会发现people上缺少注释,这可以解释行为。您是否在与people->group的链接上设置了级联?这将解释为什么第一条语句首先尝试删除该组。假设您希望在people上具有不进行级联的组注释?

1

有两个选项

1)在第二次删除之前调用flush

2)在您的映射中添加“级联”:即cascade =“delete”。删除组将同时删除组成员。


我该如何在 Group 和 People 之间添加级联删除? - Laurent K

0

你可以将其作为两个事务来处理,或者像某人提到的那样使用cascade=delete。实际上,你可能想要删除孤儿,这会进行级联删除,但仅在Person完全成为孤儿时才删除。这做了两件好事:

1)只需删除组,它就会自动删除子项(假设你的映射设置正确)。 2)如果一个Person可以属于多个组,它只会在该子Person对象变成孤儿时才删除,也就是说没有组引用它。

如果一个子对象(在本例中为Person)可以有多个父母,因此除非删除每个父母关系,否则不应删除该子对象,这是第二部分的重点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接