我在 Hibernate 3.6 中遇到级联删除问题。我在两个实体类之间有以下多对多关系:菜单和项目。请注意,这是一个单向关系。一个 Menu 实例有一个它所拥有的 Items 集的引用。但是一个 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
和(此操作实际上被数据集拒绝)。我希望 Hibernate 只删除,因为还有另一个菜单使用.item2
Item
item2
item1
我知道,当删除菜单时,我可以通过设置cascade
不包含来防止删除关联的项目CascadeType.DELETE
。但我也不想要这种行为:我确实想item2
从数据库中删除(因为没有菜单正在使用它,即它在 Menu_Item 表中没有关联)。
在 Hibernate 中实现这一目标的最佳方法是什么?