声明:

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. ArcGIS 10.2 操作SQLite

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它.ArcGIS 10.2 提供了对SQLite数据库的支持,这对那 ...

  2. JQuery插件datatables相关api

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  3. Unobtrusive Ajax

    ASP.NET MVC之Unobtrusive Ajax(五)   前言 这一节我们来讲讲Unobtrusive中的Ajax提交,大部分情况下我们是利用JQuery来进行Ajax请求,当然利用JQue ...

  4. 读 Working with forms 一些心得

    Working with forms About this document This document provides an introduction to Django’s form handl ...

  5. php(LAMP)开发环境配置相关问题及解决办法

    相信很多像我一样初次接触到php开发的人,在配置基本的开发环境时都是一头雾水,为此小编特写下自己在安装配置php开发环境过程中遇到的一些问题,及解决办法. 1.LAMP组合,安装centons+apa ...

  6. C# 通信学习笔记

    C# 通信学习笔记 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不 ...

  7. WPF点滴

    1 设置窗体的最大化,而且无边框 <Style x:Key="WindowsStyle" TargetType="Window"> <Sett ...

  8. Maven插件之git-commit-id-plugin

    SCM使用GIT而非SVN时,使用Maven发布,总是会出一些莫名其妙的问题,google查找原因,无意中看到了这个插件; 对于该插件,到目前为止,文档比较少,尤其是中文的文档;全部的信息都包含在项目 ...

  9. Linux命令之文本处理(二)

    cut命令 cut命令用来操作文件的列,能够视为列编辑器:与之相应是大多数的行"编辑器".如sed.grep.sort等,它们操作文本时,以行为单位. cut的主要功能就是输出文本 ...

  10. openstack dhcp调试

    openstack的dhcpserver默认值dnsmasq软件实施,经ps -ef | grep dnsmasq 查看.当虚拟机启动过程启动dhcp求,日志可以是在主机系统日志: May 23 22 ...