Here is my data model (simplified),
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; } }
I want to remove the entire group from my address book and all the people belonging to this group. So I am doing something like:
adressBook.getPeople().removeAll(peopleBelongingToGroupA); adressBook.getGroups().remove(groupA);
But when my transaction is complete, Hibernate does first:
delete from groups where groupName='groupA';
Instead of removing people first. This violates the FOREIGN_KEY constraint between people and the group.
Is there a way to tell hibernate to remove people first and then groups? Is there a flaw in my model?
source share