4

我在两个实体“menu_groups”和“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)

我怎么能对连接表执行此操作?谢谢

4

2 回答 2

2

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

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

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

public void remove(Page page) {
    for(MenuGroup menuGroup : page.getMenuGroups()){
        menuGroup.getPages().remove(page);
    }
    session.remove(page);
}
于 2012-08-26T22:26:05.433 回答
0

我相信您只需要在 ManyToMany 注释中设置 CascadeType 即可CascadeType.RemoveCascadeType.All如果它适合您的数据模型,您也许可以做到。其中任何一个都应该将删除级联到 Page\ManuGroup 表和连接表。

于 2012-08-24T18:31:40.763 回答