考虑这个用例。
class Category {
@OneToMany(cascade=CascadeType.ALL)
List<Application> applications = new ArrayList<Application>();
}
class Application {
@ManyToOne
Category category;
}
据我所知,在这种情况下,当删除类别时,也会删除应用程序。但谁负责加入表?为关系生成的Category_Application表。
答案 0 :(得分:3)
无论cascade
如何,都应始终删除联接表行。
对于双向ManyToMany
拥有(非mappedBy
)方将删除行。
由于你有一个ManyToOne
,你似乎应该使用mappedBy
,而不是联接表。
问题是它们是否未被删除,或者在删除之前是否出现约束错误?当您致电remove()
时,还要确保收集不为空。在调用remove
之前,请尝试删除集合中的所有内容。
答案 1 :(得分:2)
听起来这与以下问题相同:
JPA CascadeType.ALL does not delete orphans
基本上,当你有一个@OneToMany
时,JPA默认假定子对象具有独立的生命周期,并且可能与多个父对象关联。删除父级不一定会删除子级。在JPA 2.0(或Eclipselink orphanRemoval=true
或Hibernate @PrivateOwned
)中指定CascadeType.DELETE_ORPHAN
会告诉JPA在删除父级时删除子记录。
如果您始终希望将子记录生命周期与其父级绑定,您可能还需要考虑@ElementCollection而不是@OneToMany,这将提供类似的行为,但不允许您独立于父级继承子对象。 (即@ElementCollection的子对象不是@Entities。)