休眠:对联接表执行删除级联操作



我在两个实体"menu_groups"one_answers"pages"之间有一个多对多的关系,如下所示

    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"pages_id"添加删除级联操作。对于一个普通的表,该语句类似于

    @OnDelete(action=OnDeleteAction.CASCADE)

我该如何为联接表执行此操作?感谢

您必须在数据库中手动设置级联选项,然后只需对托管Page对象调用remove即可将其从链接表中删除。

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

另一方面,如果希望避免进行任何架构更改,则只需删除MenuGroup和Page之间的关联即可。在你的PageDAO(或者你使用的任何抽象)中,你可以有一个移除关联的方法:

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

我认为您只需要在ManyToMany注释中设置CascadeType就可以包含CascadeType.Remove。如果CascadeType.All符合您的数据模型,您可能可以执行它。其中任何一个都应将删除级联到Page\ManuGroup表以及联接表。

最新更新