我在Hibernate 3.6中有级联删除问题。我在两个实体类之间有以下多对多的关系:Menu和Item。请注意,这是一种单向关系。 Menu实例具有对其具有的项集的引用。但是Item实例不知道它所属的Menu实例。
@Entity
public class Menu {
@Id
private Long id;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(
name = "Menu_Item",
joinColumns = {@JoinColumn(name = "menu_id")}
inverseJoinColumns = {@JoinColumn(name = "item_id")},
)
private Set<Item> items = new HashSet<Item>();
....
}
@Entity
public class Item {
@Id
private Long id;
private String name;
private String code;
...
}
我的要求:只有当至少有一个Item
条目引用时,Menu
表中的行才应存在于数据库中。也就是说,数据库中不应存在不属于任何菜单的项目。
现在,假设以下情况,
menu1有[item1,item2]
menu2有[item1]
当我调用session.remove(menu1)
时,Hibernate会尝试从item1
表中删除item2
和Item
(此操作实际上已被数据集拒绝)。我希望Hibernate只删除item2
,因为还有另一个使用item1
的菜单。
我知道通过cascade
不包含CascadeType.DELETE
,我可以阻止在删除菜单时删除关联的项目。但我也不想要这种行为:我确实希望从数据库中删除item2
(因为没有菜单使用它,即它在Menu_Item表中没有关联)。
在Hibernate中实现这一目标的最佳方法是什么?