精通Hibernate——Hibernate中Java对象的状态详解
来源:互联网 发布:gom引擎npc算法 编辑:程序博客网 时间:2024/06/06 09:29
Hibernate中对于要持久化的Java对象在他的生命周期中需要经历以下几种状态:
1、临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于session的缓存中。处于临时状态的Java对象被称为临时对象。
2、持久化状态(persistent):已经被持久化,加入到session中,处于持久化的状态Java对象被称为持久化对象。
3、游离状态(detached):已经被持久化,但不处于session中。
下面看一下Customer对象状态转换过程
临时对象的特征
1、不处于session的缓存中,不被任何一个session实例关联
2、在数据库中没有对应的记录
在以下情况对象会进入临时对象状态
1、当通过new语句刚创建的对象
2、session的delete方法能使一个持久化对象或游离对象转换为临时对象。对于游离对象,delete方法从数据库中删除与他对应的记录;对于持久化对象,delete方法从数据库中删除与他对应的记录,对于持久化对象,delete方法从数据库中删除与他对应的记录并且把它从session中删除。
持久化对象的特征
1、位于一个session实例的缓存中,持久化对象总是被一个session实例关联
2、持久化对象和数据库中的记录对应
3、session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库,session的许多方法都能够触发Java对象进入持久化状态
4、session的save方法把临时对象转换为持久化对象
5、session的load或get方法返回的对象总是处于持久化状态
6、session的find方法返回的List集合中存放的都是持久化对象
7、session的update、saveOrUpdate、lock方法使游离对象转变为持久化对象
8、当一个持久化对象关联一个临时对象,在允许级联保存的情况下,session在清理缓存时会把这个临时对象也转换为持久化对象。
Hibernate保证在同一个session实例的缓存中,数据表中的每条记录只对应唯一的持久化对象。如下:
Session session1 = sessionFactory.openSession();Session session2 = sessionFactory.openSession();Transaction tx1 = session1.beginTransaction();Transaction tx2 = session2.beginTransaction();Customer a = (Customer)session1.load(Customer.class,new Long(1));Customer b = (Customer)session1.load(Customer.class,new Long(1));Customer c = (Customer)session2.load(Customer.class,new Long(1));System.out.println(a == b);// trueSystem.out.println(a == c);// fals
游离对象的特征
1、不再位于session缓存中,不被session关联
2、游离对象是由持久化对象转变而来,因此在数据库中可能还存在与他对应的记录
session的以下方法会使持久化对象转变为游离状态
1、当调用session的close方法,session的缓存被清空
2、session的evict方法能够从缓存中删除一个持久化对象,使他变为游离状态。当session缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑到调用evict方法,从缓存中删除一些持久化对象。但是,大多数情况不推荐使用,而是通过查询语言或者显式的导航来控制对象图的深度。
- 精通Hibernate——Hibernate中Java对象的状态详解
- Hibernate框架基础——在Hibernate中java对象的状态
- Hibernate中java对象的状态
- hibernate中java对象的状态
- Hibernate应用中Java对象的状态
- Hibernate中java对象的状态
- Hibernate中java对象的状态
- Hibernate之hibernate中java对象的状态
- 精通Hibernate——Java的内存地址与Hibernate的内置对象标识符
- Hibernate中对象的状态
- hibernate中对象的状态
- Hibernate中对象的状态
- 精通Hibernate——Hibernate缓存详解
- 【java】——Hibernate持久化对象的三个状态
- Hibernate中对象状态
- Hibernate学习笔记—Hibernate对象的三种状态
- hibernate中java 的状态
- 精通Hibernate——Java对象在JVM中的生命周期
- sql_slave_skip_counter=N 做了些什么
- HDU 5389 Zero Escape(dp解法详解) 已更新
- Leetcode #4 Median of Two Sorted Arrays
- 如何解决秒杀的性能问题和超卖的讨论
- python读取properties配置文件
- 精通Hibernate——Hibernate中Java对象的状态详解
- C++ 友元(共享数据)
- RelativeLayout用到的一些重要的属性:
- Spring---IOC应用
- MVP模式解读与实战运用(二)
- hdu5240
- HDU 3117 Fibonacci Numbers
- Linux下Android studio 创建项目build错误
- 简析Android mediaPlayer 播放在线音乐网络异常状态的处理