ALL 不删除孤儿

我在使用 JPA 删除孤立节点时遇到了以下映射的麻烦

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

我有一个孤儿角色的问题挂在数据库周围。

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

EDIT : 看起来 JPA 2.0将包含对此的支持。

189001 次浏览

根据 使用 Hibernate 的 Java 持久性级联孤儿删除不能作为 JPA 注释使用。

JPAXML 也不支持它。

如果与 Hibernate 一起使用它,则必须显式定义注释 CascadeType.DELETE_ORPHAN,它可以与 JPACascadeType.ALL一起使用。

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

执行顺序

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

在 JPA 2.0中,您现在可以使用选项 移除孤儿 = 真

@OneToMany(mappedBy="foo", orphanRemoval=true)

如果您在 EclipseLink 中使用 JPA,则必须设置 @ Private Owned注释。

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

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

事实上,CascadeType.DELETE_ORPHAN在3.5.2决赛中已经被否决了。

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

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

移除孤儿 = true 没有效果。

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

删除 TargetEntity = MyClass.class,它工作得很好。

对于记录,在 JPA2之前的 OpenJPA 中,它是@ElementDependant。

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

@OneToMany(mappedBy = "masterData", cascade = {
CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
╔═════════════╦═════════════════════╦═════════════════════╗
║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   delete    ║     deletes parent  ║    deletes parent   ║
║   parent    ║     and orphans     ║    and orphans      ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   change    ║                     ║                     ║
║  children   ║   deletes orphans   ║      nothing        ║
║    list     ║                     ║                     ║
╚═════════════╩═════════════════════╩═════════════════════╝

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

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

然后我记得我 不能使用命名的删除查询,但实体管理器。当我使用 EntityManager.find(...)方法获取实体,然后 EntityManager.remove(...)删除它,盘子也被删除。

我使用了一对一的映射,但是 child 没有被删除 JPA 给出了外键违规

在使用孤立删除 = true 之后,问题得到了解决