JPA CascadeType.ALL不会删除孤儿

Pau*_*lan 130 java orm hibernate jpa jpa-2.0

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

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

我遇到了挂在数据库周围的孤立角色的问题.

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

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

Var*_*hta 158

如果您将它与Hibernate一起使用,则必须明确定义注释CascadeType.DELETE_ORPHAN,该注释可与JPA结合使用CascadeType.ALL.

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

执行顺序

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

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

@OneToMany(mappedBy="foo", orphanRemoval=true)
Run Code Online (Sandbox Code Playgroud)

  • JPA 2.0标准现在将deleteOrphan作为@OneToMany的属性如果您使用的是最新的hibernate,您可以执行@OneToMany(...,deleteOrphan = true) (13认同)
  • 谢谢我最终走了这条路线,我认为这对于JPA规范来说有点过分了. (3认同)

Kan*_*o_V 112

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

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

  • 实际上我认为orphanRemoval = true意味着别的东西,即当我从它的父集合中删除它时删除它.请参阅http://download.oracle.com/javaee/6/tutorial/doc/bnbqa.html#giqxy (6认同)
  • +1用于提供此问题的最新答案! (4认同)
  • **orphanRemoval = true**也不起作用.它必须以旧的方式完成. (4认同)
  • 据我所知,它不适用于@ManyToMany. (3认同)

Ser*_*hyk 44

???????????????????????????????????????????????????????????
?   Action    ?  orphanRemoval=true ?   CascadeType.ALL   ?
???????????????????????????????????????????????????????????
?   delete    ?     deletes parent  ?    deletes parent   ?
?   parent    ?     and orphans     ?    and orphans      ?
???????????????????????????????????????????????????????????
?   change    ?                     ?                     ?
?  children   ?   deletes orphans   ?      nothing        ?
?    list     ?                     ?                     ?
???????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)


uı6*_*uɐp 12

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

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


小智 7

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

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

  • 感谢@reshma应该注意@PrivateOwned是一个eclipselink JPA扩展. (5认同)

Val*_*der 6

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

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

orphanRemoval = true没有效果。