1

我在 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 只删除,因为还有另一个菜单使用.item2Itemitem2item1

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

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

4

0 回答 0