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);// true
System.out.println(a == c);// fals
游离对象的特征
1、不再位于session缓存中,不被session关联
2、游离对象是由持久化对象转变而来,因此在数据库中可能还存在与他对应的记录
session的以下方法会使持久化对象转变为游离状态
1、当调用session的close方法,session的缓存被清空
2、session的evict方法能够从缓存中删除一个持久化对象,使他变为游离状态。当session缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑到调用evict方法,从缓存中删除一些持久化对象。但是,大多数情况不推荐使用,而是通过查询语言或者显式的导航来控制对象图的深度。