Ras*_*nke 12 sql jpa eclipselink cascading-deletes jpa-2.0
假设我们有两个实体,A和B. B与A有多对一的关系如下:
@Entity
public class A {
@OneToMany(mappedBy="a_id")
private List<B> children;
}
@Entity
public class B {
private String data;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想删除A对象并将删除级联到其所有子对象(B).有两种方法可以做到这一点:
1)添加cascade=CascadeType.ALL, orphanRemoval=true
到OneToMany注释,让JPA在从数据库中删除A对象之前删除所有子项.
2)按原样保留类,只需让数据库级联删除即可.
使用后面的选项有什么问题吗?它会导致实体管理器保留对已删除对象的引用吗?我选择第二个选项的原因是选项一生成n + 1个SQL查询以进行删除,当对象A包含大量子节点时可能需要较长时间,而选项二只生成一个SQL查询然后继续愉快.对此有什么"最佳实践"吗?
在EclipseLink中,如果使用@CascadeOnDelete注释,则可以使用两者.EclipseLink还将为您生成级联DDL.
请参阅 http://wiki.eclipse.org/EclipseLink/Examples/JPA/DeleteCascade
这样可以通过让数据库执行删除来优化删除,还可以通过删除对象来维护缓存和持久性单元.
请注意,orphanRemoval = true还将删除从集合中删除的对象,数据库级联约束将不会为您执行此操作,因此仍然需要在JPA中使用规则.还有一些数据库无法处理删除的关系,因为数据库只能在约束的反方向级联,具有外键的OneToOne或具有连接表的OneToMany不能在数据库上级联.
我更喜欢数据库.为什么?
归档时间: |
|
查看次数: |
5343 次 |
最近记录: |