JPA CascadeType.ALL不删除子记录

时间:2011-05-24 06:53:15

标签: java jpa

考虑这个用例。

class Category {
   @OneToMany(cascade=CascadeType.ALL)
   List<Application> applications = new ArrayList<Application>();
}

class Application {
   @ManyToOne
   Category category;       
}

据我所知,在这种情况下,当删除类别时,也会删除应用程序。但谁负责加入表?为关系生成的Category_Application表。

2 个答案:

答案 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。)