[转]Hibernate Session各种状态转换方法分析
摘自http://spiritfrog.iteye.com/blog/221177
我的印象里, Hibernate session中常用的保存操作只有:save, update, saveOrUpdate,delete;还有其他很多操作没有用过:persist(), merge(), lock(), refresh(), evict(), replicate() ,有必要弄清楚这些方法分别是做什么, 实体对象的状态会发生什么变化?

先看看这些方法中,从javadoc的注释可以得出:
临时 —> 持久
save,persist,saveOrUpdate
托管 —> 持久
update,saveOrUpdate,saveOrUpdateCopy , merge,lock,replicate,refresh
持久 —> 托管
evict
持久 —> 临时
delete
根据以上,可以看出托管->持久的方法是最多的。
那么以上各类情况下,各个方法有什么区别?应该怎样取舍?在hibernate3.2环境下,我得出以下结论:
1. save和perisit
几乎一样,都是持久化一个临时对象;
只是persist持久化的时间可能推迟到flunsh之前,而且perisit传入的对象为托管对象时,会报错,而save托管对象不会报错只是将id置null。
可以看出,在持久化一个临时对象时,只用save就行了。
2. saveOrUpdate和merge
saveOrUpdate将unsaved对象持久化或托管对象持久化;
merge,从名字也能猜到是合并,跟saveOrUpdate相似,可以持久化托管和临时对象。
不同的是:在更新时候,merge将托管对象的属性复制到session中有相同标识符(但不相等)的持久对象(如果不存在,就从db load),也就是先select 后 update;倘若找不到相同标识符的对象,则置id为null,保存临时对象。返回的是持久对象,但是merge传入的对象还是托管的。
可以看出,只有在session中已经存在一个具有相同标识符的持久对象的时候,应该采用merge,此时用saveOrUpdate会报错。当然如果碰到这类情形,将对象属性copy到已经持久化的那个相同标识符对象上也是可以的,正因为如此我一般都没用过merge。再者merge在session中不存在相同标识对象时,会多一条select,往往我们并不需要。
3. merge和replicate
replicate,通过复制来持久化当前已经脱离session的托管对象,这点上看有点像merge,但是当传入一个临时对象则会报错,而且replicate后的传入的那个对象将是持久的,这也是跟merge不同。
通过参数ReplicationMode可以控制遇到相同记录时的行为。
如果是 ReplicationMode.EXCEPTION,则在复制时如果有重复的行数据,则抛出异常。ReplicationMode.IGNORE则忽略 异常。
ReplicationMode.OVERWRITE则会覆盖掉已有行数据。ReplicationMode.LATEST_VERSION则是在有重复时使用最新的版本进行控制。
可以看出,replicate在执行复制的时候,比起merge还是有更多可控行为,ReplicationMode.LATEST_VERSION还可以保证并发修改时只更新最新的版本。
4. lock和refresh
相类似的,都将托管对象又重新持久化,而且可以指定查询时候的锁:
* 当用户显式的使用数据库支持的SQL格式SELECT ... FOR UPDATE 发送SQL的时候,锁定级别设置为LockMode.UPGRADE
* 当用户显式的使用Oracle数据库的SQL语句SELECT ... FOR UPDATE NOWAIT 的时候,锁定级别设置LockMode.UPGRADE_NOWAIT
*当Hibernate在“可重复读”或者是“序列化”数据库隔离级别下读取数据的时候,锁定模式 自动设置为LockMode.READ。这种模式也可以通过用户显式指定进行设置。
*LockMode.NONE 代表无需锁定。在Transaction结束时, 所有的对象都切换到该模式上来。与session相关联的对象通过调用update() 或者saveOrUpdate()脱离该模式。
以上只有 LockMode.NONE,先从缓存查找持久对象;其他的都直接从数据库查找。
有些不同的是,lock还有检查对象版本的能力,如果指定的锁定模式是READ, UPGRADE 或 UPGRADE_NOWAIT,那么Session.lock()就 执行版本号检查。
refresh提供了比load更方便的查找能力,一个刚脱离了session的持久对象,如果用load还需要用id查找,那么refresh就可以直接传入托管对象刷新其状态了。
5. delete和evict
evict,从session的缓存中去除当前实例。执行后对象的改变将不再和数据库保持同步。当指定级联风格为'evict’时,会级联操作关联对象。在用于批量操作的时候,清空缓存,防止内存紧张。
delete,也会从session的缓存中去除当前实例,但flunsh时会执行数据库delete,之后对象就成了临时状态。
可以看出delete比起evict,不仅从session删除,还会从数据库删除。
参考文献:
http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html
http://loveexception.iteye.com/blog/29353
[转]Hibernate Session各种状态转换方法分析的更多相关文章
- Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查
5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...
- hibernate 异常分析:java.lang.NoClassDefFoundError: org/hibernate/Session
原因: NoClassDefFoundError的含义就是说编译器找不到org/hibernate/Session这个类的定义 解决方法: 1.检查java中是否导入hibernate 包 impor ...
- Hibernate Session & Transaction详解
Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持 ...
- 1.1Hibernate持久化类和Hibernate持久化对象状态
一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...
- SSH框架之-hibernate 三种状态的转换
一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...
- Hibernate对象的状态
站在持久化的角度, Hibernate 把对象分为 4 种状态: 1. 持久化状态 2. 临时状态 3. 游离状态 4. 删除状态 Session 的特定方法能使对象从一个状态转换到另一个状态. 下面 ...
- 简单理解Hibernate三种状态的概念及互相转化
本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...
- 第二节 hibernate session介绍以及session常用方法介绍
原创地址:http://www.cnblogs.com/binyulan/p/5628579.html Session是java应用程序和hibernate框架之间的一个主要接口.它是从持久化服务中剥 ...
- Hibernate对象的状态和映射
一. Hibernate对象的状态 实体对象的三种状态: 1) 暂态(瞬时态)(Transient)---实体在内存中的自由存在,它与数据库的记录无关. po在DB中无记录(无副本),po和sessi ...
随机推荐
- MINIX3 保护模式分析
3.1 INTEL 保护模式概要 先要说明一个问题:不是 MINIX3 一定要设置这个保护模式,但是在 386 平台上, 引入了这个保护模式机制,MINIX3 不得不设立相关保护模式的内容.由于 38 ...
- 有趣的数-回文数(Palindrome number)
文章转自http://blog.163.com/hljmdjlln@126/blog/static/5473620620120412525181/ 做LC上的题"Palindrome num ...
- 如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗?
如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗? ----答案是 可以 原因: 在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了h ...
- c语言中函数的递归
题目:用递归法把一个整数转换成字符串输出. 比较下面两种方法的不同: putchar(n%10+'0')的位置不同,造成输出结果的不同. 方法一: #include <stdio.h> v ...
- iframe session过期跳转到登陆页面
在login.jsp中添加js: if(window !=top){ top.location.href=location.href; } <script type="text/jav ...
- sgu548 Dragons and Princesses 贪心+优先队列
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=548 题目意思: 有一个骑士,要经过n个房间,开始在第一个房间,每个房间里面有龙或者 ...
- [USACO11JAN]利润Profits
题目描述 The cows have opened a new business, and Farmer John wants to see how well they are doing. The ...
- LeetCode(228) Summary Ranges
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
- 学生管理系统-火车订票系统 c语言课程设计
概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...
- Teaching Your Computer To Play Super Mario Bros. – A Fork of the Google DeepMind Atari Machine Learning Project
Teaching Your Computer To Play Super Mario Bros. – A Fork of the Google DeepMind Atari Machine Learn ...