Hibernate3通过清理进行多对多级联删除

时间:2014-02-06 10:22:25

标签: hibernate many-to-many cascade hibernate-cascade

我在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表中删除item2Item(此操作实际上已被数据集拒绝)。我希望Hibernate只删除item2,因为还有另一个使用item1的菜单。

我知道通过cascade不包含CascadeType.DELETE,我可以阻止在删除菜单时删除关联的项目。但我也不想要这种行为:我确实希望从数据库中删除item2(因为没有菜单使用它,即它在Menu_Item表中没有关联)。

在Hibernate中实现这一目标的最佳方法是什么?

0 个答案:

没有答案