我在两个实体"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表以及联接表。