Java JPA CascadeType.ALL不删除子记录
考虑这个用例Java JPA CascadeType.ALL不删除子记录,java,jpa,Java,Jpa,考虑这个用例 class Category { @OneToMany(cascade=CascadeType.ALL) List<Application> applications = new ArrayList<Application>(); } class Application { @ManyToOne Category category; } 类别{ @OneToMany(级联=级联类型.ALL) 列表应用程序=新建Arr
class Category {
@OneToMany(cascade=CascadeType.ALL)
List<Application> applications = new ArrayList<Application>();
}
class Application {
@ManyToOne
Category category;
}
类别{
@OneToMany(级联=级联类型.ALL)
列表应用程序=新建ArrayList();
}
班级申请{
@许多酮
类别;
}
我理解,在这种情况下,当类别将被删除时,应用程序也将被删除。但是谁来管理联接表呢?为关系生成的Category\u应用程序表。无论
级联如何,都应始终删除联接表行
对于双向manyTo owning(非mappedBy
)侧将删除行
由于您有一个manytone
,因此您似乎应该使用mappedBy
,而不是联接表
问题是它们没有被删除,还是在删除之前您遇到了约束错误?调用remove()
时,还要确保集合不是空的。在调用remove
之前,请尝试删除集合中的所有内容。无论cascade
如何,都应始终删除联接表行
对于双向manyTo owning(非mappedBy
)侧将删除行
由于您有一个manytone
,因此您似乎应该使用mappedBy
,而不是联接表
问题是它们没有被删除,还是在删除之前您遇到了约束错误?调用remove()
时,还要确保集合不是空的。在调用remove
之前,请尝试删除集合中的所有内容。听起来这与以下问题相同:
基本上,当您有一个@OneToMany
时,JPA默认假定子对象具有独立的生命周期,并且可能与多个父对象关联。删除父项并不一定会删除子项。在JPA 2.0(或Eclipselink@PrivateOwned
或HibernateCascadeType.DELETE_ORPHAN
)中指定OrphanRemoving=true
)告诉JPA在删除父记录时删除子记录
如果您总是希望将子记录生命周期绑定到它的父级,那么您可能还需要考虑@ EntEngices集合,而不是@ OneToMany,它将给出类似的行为,但不允许您独立于父对象来保存子对象。(也就是说,@ElementCollection的子对象不是@Entities。)
听起来这和以下问题是一样的:
基本上,当您有一个@OneToMany
时,JPA默认假定子对象具有独立的生命周期,并且可能与多个父对象关联。删除父项并不一定会删除子项。在JPA 2.0(或Eclipselink@PrivateOwned
或HibernateCascadeType.DELETE_ORPHAN
)中指定OrphanRemoving=true
)告诉JPA在删除父记录时删除子记录
如果您总是希望将子记录生命周期绑定到它的父级,那么您可能还需要考虑@ EntEngices集合,而不是@ OneToMany,它将给出类似的行为,但不允许您独立于父对象来保存子对象。(即@ElementCollection的子对象不是@Entities。)
i James,谢谢您的回复。不,我没有收到任何错误,但联接表的行没有被删除。这是我唯一的问题。当我删除实体时,我不确定该实体的集合中是否充满了联接值。但是,即使我没有填写集合,表引用在默认情况下也应该删除它,不是吗?由于我提到的级联类型,如果集合为空,则不需要删除,因为没有要删除的行。您是如何获得要移除的对象的?您使用的JPA提供商和版本是什么?我是詹姆斯,谢谢您的回复。不,我没有收到任何错误,但联接表的行没有被删除。这是我唯一的问题。当我删除实体时,我不确定该实体的集合中是否充满了联接值。但是,即使我没有填写集合,表引用在默认情况下也应该删除它,不是吗?由于我提到的级联类型,如果集合为空,则不需要删除,因为没有要删除的行。您是如何获得要移除的对象的?您使用的JPA提供商和版本是什么?