2008-11-20 118 views
116

与以下映射JPA CascadeType.ALL不会删除我在使用JPA无法删除孤儿节点孤儿

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

我有挂在数据库中的孤立角色的问题。

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

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

回答

138

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

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

执行顺序

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

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

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

感谢我结束了走这条路,我觉得这对于JPA规范来说有些过分了。 – 2008-11-21 08:49:29

+12

JPA 2.0标准现在拥有deleteOrphan作为@OneToMany的一个属性 如果您使用最新的休眠,您可以执行@OneToMany(...,deleteOrphan = true) – jomohke 2010-06-11 06:33:13

+0

当我更新子元素时,执行顺序是什么?将孤儿记录删除? – jAckOdE 2014-05-26 07:22:53

104

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

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

+3

+1为这个问题提供最新的答案! – 2010-09-02 09:02:22

+5

实际上我认为orphanRemoval = true意味着其他的东西,也就是说,当我从父母的集合中删除一个对象时,删除一个对象。如我所知,请参阅http://download.oracle.com/javaee/6/tutorial/doc/bnbqa.html#giqxy – Archie 2010-09-13 22:37:43

+3

它不能与@ManyToMany一起使用。 – ses 2011-03-17 18:43:41

4

我只是觉得这个解决方案但对我来说这是行不通的:

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

orphanRemoval =真没有效果。

2

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

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

1

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

7

可以使用@PrivateOwned删除孤儿 e.g

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

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

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

然后我想起我不能使用一个名为删除查询,但EntityManager的。由于我使用EntityManager.find(...)方法获取实体,然后使用EntityManager.remove(...)删除它,菜肴也被删除。

0

我用的是一对一的映射,但孩子没有得到删除JPA是给外键冲突

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