140

我在使用具有以下映射的 JPA 删除孤立节点时遇到问题

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;

我遇到了围绕数据库的孤立角色的问题。

我可以使用注释org.hibernate.annotations.CascadeHibernate 特定标记,但显然我不想将我的解决方案绑定到 Hibernate 实现中。

编辑:似乎 JPA 2.0 将包括对此的支持。

4

11 回答 11

168

如果您将它与 Hibernate 一起使用,则必须显式定义 annotation CascadeType.DELETE_ORPHAN,它可以与 JPA 结合使用CascadeType.ALL

如果您不打算使用 Hibernate,则必须先显式删除子元素,然后再删除主记录以避免任何孤立记录。

执行顺序

  1. 获取要删除的主行
  2. 获取子元素
  3. 删除所有子元素
  4. 删除主行
  5. 关闭会话

使用 JPA 2.0,您现在可以使用选项orphanRemoval = true

@OneToMany(mappedBy="foo", orphanRemoval=true)
于 2008-11-20T22:54:33.773 回答
113

如果您使用的是 JPA 2.0,您现在可以使用注解的orphanRemoval=true属性来移除孤儿。@xxxToMany

实际上,CascadeType.DELETE_ORPHAN已在 3.5.2-Final 中弃用。

于 2010-05-28T11:18:37.447 回答
48
╔═════════════╦═════════════════════╦═════════════════════╗
║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   delete    ║     deletes parent  ║    deletes parent   ║
║   parent    ║     and orphans     ║    and orphans      ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   change    ║                     ║                     ║
║  children   ║   deletes orphans   ║      nothing        ║
║    list     ║                     ║                     ║
╚═════════════╩═════════════════════╩═════════════════════╝
于 2013-10-28T21:28:02.170 回答
12

如果您将 JPA 与 EclipseLink 一起使用,则必须设置@PrivateOwned注释。

文档:Eclipse Wiki - 使用 EclipseLink JPA 扩展 - 第 1.4 章如何使用 @PrivateOwned 注释

于 2009-09-01T12:01:22.787 回答
7

您可以使用@PrivateOwned 删除孤儿,例如

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
于 2011-07-08T11:03:04.710 回答
6

我只是找到了这个解决方案,但在我的情况下它不起作用:

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = true没有效果。

于 2010-10-06T12:07:30.093 回答
4

根据Java Persistence with Hibernate级联孤儿删除不能用作 JPA 注释。

JPA XML 也不支持它。

于 2008-11-20T17:38:10.947 回答
3

我有同样的问题,我想知道为什么下面的这个条件没有删除孤儿。当我执行命名删除查询时,Hibernate (5.0.3.Final) 中的菜肴列表没有被删除:

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();

然后我记得我不能使用命名删除查询,而是使用 EntityManager。当我使用该EntityManager.find(...)方法获取实体然后EntityManager.remove(...)删除它时,菜肴也被删除了。

于 2015-11-01T17:39:06.100 回答
2

只是@OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)

删除targetEntity = MyClass.class,效果很好。

于 2010-12-11T12:08:25.450 回答
1

根据记录,在 JPA2 之前的 OpenJPA 中,它是 @ElementDependant。

于 2011-05-18T16:35:15.903 回答
0

我正在使用一对一映射,但孩子没有被删除 JPA 违反了外键

使用 orphanRemoval = true 后,问题得到解决

于 2016-01-13T06:27:17.520 回答