2011-05-24 113 views
0

考虑这个用例。JPA CascadeType.ALL不删除子记录

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

class Application { 
    @ManyToOne 
    Category category;  
} 

我明白,在这种情况下,当类别被删除时,应用程序也会被删除。但谁照顾连接表?为关系生成的Category_Application表。

回答

2

连接表的行应该总是被删除,不管级联与否。

对于双向ManyToMany拥有(non-mappedBy)方将删除行。

既然你有一个ManyToOne回来,看来你应该使用mappedBy而不是一个连接表。

问题是他们没有被删除,或者你在删除之前得到一个约束错误?还要确保在调用remove()时收集si不为空。在调用remove之前,尝试从集合中删除所有内容。

+0

I James,谢谢你的回复。不,我没有收到任何错误,但连接表的行不会被删除。这是我唯一的问题。 当我删除实体时,我不确定该实体是否具有填充连接值的集合。但不是它表格引用应该默认删除它,即使我没有收集完成?由于我提到的级联类型? – Jahid 2011-05-25 09:28:44

+0

如果集合为空,则不需要删除,因为没有要删除的行。你是如何得到你要删除的对象的?您使用的是JPA提供商和版本? – James 2011-05-25 13:51:05

2

听起来好像这是相同的问题:

JPA CascadeType.ALL does not delete orphans

基本上,当你有一个@OneToMany,JPA假设默认情况下,该子对象具有独立生命周期,并可以关联到多个家长。删除父母并不一定会删除孩子。在JPA 2.0中指定orphanRemoval=true(或Eclipselink @PrivateOwned或Hibernate CascadeType.DELETE_ORPHAN)告诉JPA在删除父项时删除子记录。

如果您始终想要将子记录lifecyle绑定到其父项,您可能还需要考虑@ElementCollection而不是@OneToMany,它会给出类似的行为,但不会让您独立于父项保留子对象。 (即@ElementCollection的子对象不是@Entities。)