JPA CascadeType.ALL不会删除孤儿

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

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

数据库中存在孤立angular色的问题。

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

编辑 :看来JPA 2.0将包括对此的支持。

如果您在Hibernate中使用它,则必须明确定义注释CascadeType.DELETE_ORPHAN ,该注释可以与JPA CascadeType.ALL结合使用。

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

执行顺序

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

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

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

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

实际上, 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 ║ ║ ║ ╚═════════════╩═════════════════════╩═════════════════════╝ 

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

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

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

 @OneToMany(mappedBy = "masterData", cascade = { CascadeType.ALL }) @PrivateOwned private List<Data> dataList; 

根据Hibernate的Java持久性 , 级联孤立删除不可用作为JPA注释。

它在JPA XML中也不受支持。

我只是find这个解决scheme,但在我的情况下,它不工作:

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

orphanRemoval = true不起作用。

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

删除targetEntity = MyClass.class ,它的工作很好。

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

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

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

对于logging,在JPA2之前的OpenJPA中是@ElementDependant。

我正在使用一对一的映射,但是孩子没有被删除JPA正在给外键违规

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