JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN

转载 2015年07月09日 11:12:52

看到一篇好文,转载自http://blog.csdn.net/sinlff/article/details/7342527

本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供。

很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。
理论是使用JPA接口可以无缝切换持久层实现,但是仅仅是理论上!!!


JPA是在Hibernate成熟并大行其道的时候才推出的,基本上是借鉴Hibernate的优点,做了一个统一的标准而已,JPA1.0没有一对多的级联删除配置,也许JPA2.0里才有吧(这里没做过调研)
@OneToMany(mappedBy = "commentTeam")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<CommentTeamMember> commentTeamMembers;
这里为了说明,只贴出一对多的关键代码,其它无关的注解已忽略掉,以免造成干扰。
这里重点说明一下四个常用的注解配置的区别:
CascadeType.SAVE_UPDATE
CascadeType.ALL
CascadeType.DELETE
CascadeType.DELETE_ORPHAN


 之所有之列出这四个,是因为我不想跟书本上把所有的概念都罗列出来。基本上开发时其中的3个都以及足够用了,下面我结合代码演示一下他们之间的区别,以及使用的时候注意的地方。
CascadeType.SAVE_UPDATE:Hibernate专有的,JPA并不支持,作用是级联保存、级联更新(注:JPA很恶心,要么你配置
CascadeType.ALL,要么你配CascadeType.SAVE+CasadeType.Merge。八卦一句:专家虽牛,多年不写代码,定的标准让编码麻烦呀!)
CascadeType.ALL:级联保存、修改、删除、同步,一般很少用,看看控制台的一长串SQL就知道性能低下,你没改的关联表也给你发update语句,我从来没用过这个属性。
CascadeType.DELETE:当调用session.delete(A)的时候,级联删除关联的对象。(注:先调用A.setB(null),再调用session.delete(A),这样是级联删不掉B的。
CascadeType.DELETE_ORPHAN:一对多级联删除。


下面重点来说说这个CascadeType.DELETE_ORPHAN:
看过API、开发指南,级联删除就一个经典的
@OneToMany(mappedBy = "commentTeam")
@Cascade({CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN})
private Set<CommentTeamMember> commentTeamMembers;


mappedBy不可少,映射A->B一对多的另一边控制反转(谁控谁的问题),新版的Hibernate3.4中配置更简单,变一句了,更简洁吧?
@OneToMany(mappedBy = "commentTeam",orphanRemoval=true) 
private Set<CommentTeamMember> commentTeamMembers;


以上两种配置方式是等价的,下面是在实际开发中的使用了,有些时候代码方面不注意,会误以为明明配置正确了,但为什么不起作用呢? 下面例举一下代码,请看Action代码(实际上我在Spring Controller里,N年不写DAO了,Service很少用,Manager一边去!)
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
commentTeam.setCommentTeamMember(null);//想级联删除子表数据
this.getHibernateTemplate.saveOrUpdate(commentTeam);
这样级联删除却没有发生?为什么呢?
再来一个例子
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
Set<CommentTeamMember> commentTeamMembers=new HashSet<CommentTeamMember>();
commentTeam.setCommentTeamMember(commentTeamMembers);//想级联删除子表数据或增减替换对象
this.getHibernateTemplate.saveOrUpdate(commentTeam);
这个例子级联删除的效果也没发生!即使commentTeamMembers理由有若干个对象。


成功执行级联删除的语法:
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
commentTeam.getCommentTeamMember().clear();//注意这里引用的集合还是原理的集合,这里没有重新new过
commentTeam.getCommentTeamMember().add(new CommentTeamMember());//如果想替换为新的集合可以用addAll方法
this.getHibernateTemplate.saveOrUpdate(commentTeam);

分析一下原因:级联删除起作用的前提是关联的集合对象不能重新指向新的引用,必须在原有的集合里操作新增、删除、清空元素,像上面的setXXX(null)的方法等是起步到级联删除作用的,大概是Hibernate自认自己原生的集合对象吧,自己New的放进行级联删除无效!

再谈Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN

声明: 1、本文系原创,非抄袭或转载过来的。 2、本文论点都亲手做过实验论证。 3、本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供。 很多人对持久层概念搞不清JPA、Hib...
  • sinlff
  • sinlff
  • 2012-03-12 01:23:39
  • 21059

hibernate cascade属性 all-delete-orphan

当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan 所谓父子关系,即指由父方控制子方的持久化圣明周期,子方对象必须和一个父方对象关联。如果删除父...
  • JBxiaozi
  • JBxiaozi
  • 2012-02-19 18:31:24
  • 15076

all-delete-orphan

标签: all-delete-orphan   当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan所谓父子关系,即指由父方控制子方的持久化圣明周...
  • zhh521125
  • zhh521125
  • 2010-10-20 14:38:00
  • 6611

all-delete-orphan

原文链接:http://blog.csdn.net/zhh521125/article/details/5954137 当关联双方存在父子关系,就可以在 set 处设定 cascade 为 al...
  • liliiii
  • liliiii
  • 2016-05-12 21:38:10
  • 325

delete和all-delete-orphan在进行删除操作时的不同

delete:当通过Session的delete()方法删除当前对象时,级联删除所有关联的对象。 delete-orphan:删除所有和当前对象解除关联关系的对象。 all-delete-...
  • qianshu8
  • qianshu8
  • 2014-12-28 09:05:17
  • 611

Hibernate4 注解配置实现一对多级联删除

用了hibernate有一段时间了,不过总是写很简单的功能,今天看了一下hibernate的级联删除,发现网上有很多代码已经过时了,即使没有过时的也有许多坑没有说明,在踩了n个坑后终于实现了hiber...
  • W895972478
  • W895972478
  • 2015-08-03 20:53:45
  • 8749

Hibernate annotation JPA 一对多,多对多

  • 2009年11月04日 17:10
  • 6.69MB
  • 下载

[免费]hibernate_配置cascade_及all-<em>delete</em>-<em>orphan</em>.doc

\\hibernate_配置cascade_及all-<em>delete</em>-<em>orphan</em>.doc 综合评分:0(0位用户评分) 收藏评论举报 所需: 0积分/C币 下载个数: 0 开通VIP 立即下载 ...
  • 2018年03月27日 00:00

hibernate cascade属性 all-delete-orphan

当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan 所谓父子关系,即指由父方控制子方的持久化圣明周期,子方对象必须和一个父方对象关联。如果删...
  • ZChangfeng
  • ZChangfeng
  • 2015-12-09 19:54:26
  • 309

Hibernate单向多对一级联删除引发的问题

Hibernate单向多对一在级联删除时,会出现一些问题。 下面模拟我遇到的问题: 这次模拟与之前的一次模拟方法一直,博客:http://blog.csdn.net/openjdk8/article/...
  • u012356022
  • u012356022
  • 2014-08-11 21:41:09
  • 3049
收藏助手
不良信息举报
您举报文章:JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN
举报原因:
原因补充:

(最多只允许输入30个字)