gpt4 book ai didi

java - Hibernate删除查询的顺序

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:59 25 4
gpt4 key购买 nike

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

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';

而不是先删除人。这会导致违反人与组之间的 FOREIGN_KEY 约束。

有没有办法让hibernate先删除人,再删除组?我的模型有缺陷吗?

最佳答案

您是否尝试过在每个@ManyToOne 上设置级联。在许多方面,您只指定了地址簿上的级联删除。此属性适用于我认为的每个协会。

EJB3.0 规范非常值得在编写这些 bean 时掌握。参见 http://jcp.org/en/jsr/detail?id=220

更新:再次阅读您的数据模型,这里的人可能缺少解释行为的注释。您是否在 people->group 的链接上设置了级联?这可以解释为什么第一个语句会首先尝试删除组。据推测,您想要一个不级联的人群注释?

关于java - Hibernate删除查询的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com