声明:

1、本文系原创,非抄袭或转载过来的。

2、本文论点都亲手做过实验论证。

3、本文所讲的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. 谈论Hibernate级联删除——JPA根据Hibernate实现许多级联删除CascadeType.DELETE_ORPHAN

    声明: 1.这篇文章是原创.非复制或转载过来. 2.在本文中,参数都亲自做过实验证明. 3.这篇文章谈到了Hibernate配置基于注释的方法.hbm语法不可用. 不清JPA.Hibernate.EJ ...

  2. 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多【转】

    [http://blog.sina.com.cn/s/blog_625d79410101dbdd.html]   看过前两篇帮助文档 [JPA] @OneToOne 单向 和 [JPA]@OneToO ...

  3. C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)

    STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...

  4. C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

    STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...

  5. 再谈fedora23下Virutalbox的安装. --问题的关键在于 安装kernel-devel包

    首先, 要使用 virutalbox的 rpm 安装包 进行安装. 在安装的过程中, 如果提示 有一些包, 没有, dependencies not resolved, 比如libQt..libvpx ...

  6. JPA中自定义的插入、更新、删除方法为什么要添加@Modifying注解和@Transactional注解?

    前几天,有个同事在使用JPA的自定义SQL方法时,程序一直报异常,捣鼓了半天也没能解决,咨询我的时候,我看了一眼他的程序,差不多是这个样子的: @Repository public interface ...

  7. JPA学习(基于hibernate)

    参考博客:https://blog.csdn.net/baidu_37107022/article/details/76572195 常用注解: https://blog.csdn.net/eastl ...

  8. 再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  9. Intellij Idea 15 下新建 Hibernate 项目以及如何添加配置

    1.说明:Idea 下,项目对应于 Eclipse 下的 workspace,Module 对应于 Eclipse 下的项目.Idea 下,新添加的项目既可以单独作为一个 Project,也可以作为一 ...

随机推荐

  1. 浏览器url传参中文时得到null的解决方法

    在写一个中文参数需求的时候遇到了以下问题,经过半天的测试和各种编码,以及网上一些有用没用的资料尝试终于解决    比如下面的url地址:http://travel.widget.baike.com:8 ...

  2. OC 获取城市首字母

    解析依据文件中面的内容,读入一个城市,输出所在首字母 比方读入 长春 输出 c 读入 北京 输出 b 不知道文本中的字体是什么格式 读取文件时 程序不能正确执行 运用oc中的字典 initWithOb ...

  3. hdu4341(分组背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4341 题意:一个人在原点(0,0)抓金子,每块金子有一个获得需要的时间t和价值v.而且有的金子可能在一 ...

  4. hdu2606(递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2606 题意:  用1*1,2*2,3*3,4*4的正方形填充4*n的矩形, 问有多少种不同填法. 分析 ...

  5. 物联网 开发板 基于ESP8266

    The ESP8266 The ESP8266 is a highly integrated chip designed for the needs of an increasingly connec ...

  6. Spring IOC及AOP学习总结

    一.Spring IOC体系学习总结: Spring中有两个容器体系,一类是BeanFactory.还有一类是ApplicationContext.BeanFactory提供了基础的容器功能.Appl ...

  7. Knockout应用开发指南 第七章:Mapping插件

    原文:Knockout应用开发指南 第七章:Mapping插件 Mapping插件 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些 ...

  8. HashMap-死锁导致cpu占用100%分析(转)

    最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下. 先放出问题的代码 ? 1 2 3 4 5 ...

  9. 判断 iPhone 是否已插入 SIM 卡的方法

    判断 iPhone 是否插入了 SIM 卡,可以参考苹果官网的 systemconfigure framework 教程,将下面的代码复制到头文件 extern NSString* const kCT ...

  10. MySQL 改动用户password及重置rootpassword

    为数据库用户改动password是DBA比較常见的工作之中的一个.对于MySQL用户账户的password改动,有几种不同的方式.推荐的方式使用加密函数来改动password. 本文主要描写叙述了通过 ...