【hibernate】对象状态和主要方法
2014-05-22 19:44
281 查看
hibernate对象在内存中的四种状态
临时状态(transient):刚用new创建的,还没有被持久化,并且不处于Session的缓存中,处于临时状态的java对象成为临时对象。持久化状态(persistent):已经被持久化,并且加入到了Session的缓存中,处于持久化状态的java对象成为持久化对象。
删除状态(removed):
游离状态(detached):已经被持久化,但不再处于Session的缓存中,处于游离状态的java对象成为游离对象。
举例:
tx = session.beginTransaction(); User u1 = new User("zhangsan"); | 开始生命周期 | 临时状态 |
session.save(u1); | 生命周期中 | 转变为持久化状态 |
Long id = u1.getId(); u1 = null; User u2 = (User)session.get(User.class,id); tx.commit(); | 生命周期中 | 持久化状态 |
session.close(); | 生命周期中 | 转变为游离状态 |
System.out.print(u2.getName()); | 生命周期中 | 游离状态 |
u2 = null; | 结束生命周期 | 结束生命周期 |
Session缓存的三大作用
1、减少访问数据库的频率。2、当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由于死循环引起的JVM堆栈溢出异常。
3、保证数据库中的相关记录与缓存中的相关对象保持同步。对象-关系映射文件建立了数据库表与持久化类的静态映射,而Session则建立了数据库表中的数据与程序运行时的Session缓存中的持久化对象的动态映射。
Session接口的具体方法
Session接口是Hibernate向应用程序提供操纵数据库数据的主要接口。1、save()和persist()方法
save方法使一个临时对象转变为持久化对象。在应用程序中,不应该把持久化对象或游离对象传给save()方法
persist和save类似,也是把一个临时对象转变为持久化对象。
不同之处:persist方法是在Hibernate3版本中才出现的,实现了EJB3规范中定义的持久化语义。
2、load和get方法
load和get方法都能根据给定的OID从数据库中加载一个持久化对象。
区别:
当数据库中不存在与OID对应的记录时,load方法抛出org.hibernate.ObjectNotFoundException异常,而get方法返回null。
采用的检索策略不同:
load:在默认情况下,load方法采用延迟检索策略加载持久化对象,除非把<class>元素的lazy属性的值设为false,load方法才会采用立即检索策略。
get:get方法会忽略<class>元素的lazy属性,不管lazy属性取什么值,get方法总是采用立即检索策略。
根据不同的业务场景,选择合适的方法。
3、update方法
update方法使一个游离对象转变为持久化对象,并且会计划执行一条update语句。
在Session清理缓存时,根据User对象的当前属性来组装update语句,不管User对象的属性是否发生变化,Session在清理缓存的时候都会执行由update方法计划的update语句。
如果希望Session仅当修改了User对象的属性时,才执行update语句,可以修改映射文件中<class>元素的select-before-update设为true,该属性的默认值是false,如果修改为true,当Session清理缓存时,会先执行一条select语句,然后比较User对象的属性是否和数据库中检索出来的记录一致,只有在不一致的情况下,才执行update语句。
根据实际情况来设置select-before-update的值,如果java对象需要经常改变,就设置为false,如果不会经常变化,可以设置为true,避免Session执行不必要的update语句。
4、saveOrUpdate方法
包含了save和update方法的功能,如果传入的参数是临时对象,就调用save方法,如果传入的参数是游离对象,就调用update方法,如果传入的参数是持久换对象,就直接返回。
5、merge方法
merge方法能够把一个游离对象的属性复制到一个持久化对象中。
u1.setName("zhangsan");//u1为游离对象,OID为1
User u2 = (User)session.get(User.class,new Long(1));//u2成为了持久化对象
User u3 = (User)session.merge(u1);//把游离对象u1的属性复制到持久化对象u2中,并返回User持久化对象的引用
u1 == u2;//false
u1 == u3;//false
u2 == u3;//true
处理流程:
a、merge方法根据u1游离对象的OID到Session缓存中查找匹配的持久化对象,找到了u2符合要求,就把u1游离对象的属性复制到u2持久化对象中,,计划执行一条update语句,返回u2持久化对象的引用。
b、如果在Session缓存中没有找到,那么就根据这个OID从数据库中加载User持久化对象,然后把u1游离对象的属性复制到这个刚从数据库加载的User持久化对象中,计划执行一条update语句,返回这个User持久化对象的引用。
c、如果数据库中不存在这样的User持久化对象,就会创建一个新的User对象,把u1游离对象的属性复制到这个新建的User对象中,再调用save方法持久化这个新建的对象,然后返回这个User持久化对象的引用。
d、如果u1是一个临时对象,那么也会创建一个新的User对象,把u1临时对象的属性复制到这个新建的User对象中,然后调用save方法持久化这个新建的User对象,然后返回这个User持久化对象的引用。
6、delete方法
用户从数据库中删除一个对象,既可以删除持久化对象,也可以删除游离对象。
delete方法把持久化对象或游离对象转变为被删除对象,被删除对象时无用对象,程序不应该再使用这些对象。
在Hibernate的hibernate.properties配置文件中有一个hibernate.use_identifier_rollback属性,默认值是false,如果改为true,就改变了Session的delete方法的运行时行为,这时delete方法会把持久化对象或游离对象的OID置为null,使他们变为临时对象,这样程序可以继续使用这些临时对象。
7、replicate
把一个数据库中的对象复制到另一个数据库中。不经常用,仅作了解。
相关文章推荐
- 【学习笔记】Hibernate中对象的状态和转换以及Session的主要方法总结
- Hibernate几个易混淆方法解析及对象状态解析
- hibernate中PO对象的三种状态分析以及session中的一些方法的区别
- Hibernate持久化对象状态 Session缓存(一级缓存),快照 操纵持久化对象的方法
- Hibernate的持久化对象状态的方法
- 对象的三种状态(hibernate的session的get和load方法的区别,session的常用方法,session缓存)
- hibernate的持久化对象的状态,n+1问题和load和get方法区别
- Hibernate持久化对象状态、转换方法和操作步骤
- 【SSH三大框架】Hibernate基础第三篇:实体对象的三种状态以及get、load、persist三个方法的详解
- Hibernate对象的三种状态区别以及save等几种方法的区别
- 框架学习之Hibernate 第四节 实体对象的三种状态和saveOrUpdate方法
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
- Hibernate入门:CRUD方法及实体对象的三种状态
- Hibernate中对象的三种状态,以及三种状态间的转化方法
- 05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法 2 关于delete后的状态
- 【Hibernate框架开发之五】Hibernate对象的三种状态&&Session的常用方法
- hibernate中PO对象的三种状态分析以及session中的一些方法的区别
- Hibernate几个易混淆方法解析及对象状态解析
- Hibernate之Session对象的相关方法以及持久化对象的状态
- Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征