Answers:
如果将它与Hibernate一起使用,则必须显式定义批注CascadeType.DELETE_ORPHAN
,该批注可与JPA结合使用CascadeType.ALL
。
如果您不打算使用Hibernate,则必须先明确删除子元素,然后再删除主记录,以避免出现任何孤立记录。
执行顺序
在JPA 2.0中,您现在可以使用选项orphanRemoval = true
@OneToMany(mappedBy="foo", orphanRemoval=true)
如果使用的是JPA 2.0,则现在可以使用批注的orphanRemoval=true
属性@xxxToMany
来删除孤立对象。
实际上,CascadeType.DELETE_ORPHAN
已在3.5.2-Final中弃用。
╔═════════════╦═════════════════════╦═════════════════════╗
║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ delete ║ deletes parent ║ deletes parent ║
║ parent ║ and orphans ║ and orphans ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ change ║ ║ ║
║ children ║ deletes orphans ║ nothing ║
║ list ║ ║ ║
╚═════════════╩═════════════════════╩═════════════════════╝
cascade = CascadeType.ALL, orphanRemoval = false
并删除父母,该怎么办?即使我已经明确告诉“不要”,它也会删除孩子吗?
如果将JPA与EclipseLink一起使用,则必须设置@PrivateOwned批注。
文档:Eclipse Wiki-使用EclipseLink JPA扩展-第1.4章如何使用@PrivateOwned注释
我只是找到此解决方案,但对我而言却行不通:
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
orphanRemoval = true无效。
根据带有Hibernate的Java Persistence,级联孤立删除不能用作JPA批注。
JPA XML也不支持它。
我遇到了同样的问题,我想知道为什么下面的这种情况没有删除孤儿。当我执行一个命名的删除查询时,在Hibernate(5.0.3.Final)中没有删除餐具列表:
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();
然后,我想起了我一定不能使用命名删除查询,而是EntityManager。当我使用该EntityManager.find(...)
方法获取实体然后EntityManager.remove(...)
将其删除时,餐具也被删除了。
对于记录,在JPA2之前的OpenJPA中,它是@ElementDependant。
我正在使用一对一映射,但是未删除子级JPA违反了外键
使用orphanRemoval = true后,问题得到解决