Hibernate:关于连接表的删除级联操作

时间:2012-08-24 18:19:37

标签: hibernate jpa

我在两个实体和菜单组之间存在多对多关系'和'页面'如下

    public class MenuGroup {
        @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
        @JoinTable(name = "menu_group_pages",schema="live",    
                  joinColumns=@JoinColumn(name="menu_groups_id"),
                  inverseJoinColumns=@JoinColumn(name="pages_id"))
        private Set<Page> pages = new HashSet<Page>();
    }

    public class Page {
       @ManyToMany(fetch = FetchType.EAGER, mappedBy="pages", 
                   cascade={CascadeType.MERGE})

       private Set<MenuGroup> menuGroups = new HashSet<MenuGroup>();
    }

正如您所看到的,有一个连接表有两个fk:menu_groups_id和pages_id。现在我想为fk&#39; pages_id&#39;添加删除级联操作。在这个连接表中。对于普通表,语句类似于

    @OnDelete(action=OnDeleteAction.CASCADE)

我怎么能为连接表做这个?感谢

2 个答案:

答案 0 :(得分:2)

您必须在数据库中手动设置级联选项,然后在托管页面对象上调用remove以将其从链接表中删除。

OnDelete注释应该已经在DB中生成了级联选项,但它似乎不适用于ManyToMany(HHH-4404

另一方面,如果您想避免进行任何架构更改,那么您只需要删除MenuGroup和Page之间的关联。在您的PageDAO(或您使用的任何抽象)中,您可以使用删除关联的remove方法:

public void remove(Page page) {
    for(MenuGroup menuGroup : page.getMenuGroups()){
        menuGroup.getPages().remove(page);
    }
    session.remove(page);
}

答案 1 :(得分:0)

我认为你需要在ManyToMany注释中设置CascadeType以包含CascadeType.Remove。如果它适合您的数据模型,您可以CascadeType.All。这些中的任何一个都应该将删除级联到Page \ ManuGroup表和连接表。