Hibernate 对象的三种状态

来源:互联网 发布:淘宝商品鞋子详情图片 编辑:程序博客网 时间:2024/05/20 10:12

在Hibernate中,对象有三种状态:临 时状态(Transient)、持久状态(Persistent)和游离状态(Detached)。

1. 临时状态 

当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:
 Customer customer=new Customer();
这时customer对象就处于自由状态,为什么说customer对象处于自由状态呢?这是因为,此时customer只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说customer对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。

瞬时对象特点:

(1) 不和 Session 实例关联

(2) 在数据库中没有和瞬时对象关联的记录

2. 持久状态 (Persistent)

持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。

持久对象总是与 Session 和 Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏 (dirty) 对象。

瞬时对象转为持久对象:

(1) 通过 Session 的 save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。

(2) 使用 fine(),get(),load() 和 iterater() 待方法查询到的数据对象,将成为持久化对象。

持久化对象的特点:

(1) 和 Session 实例关联

(2) 在数据库中有和持久对象关联的记录

3. 脱管状态 (Detached)

当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。
当session关闭后,对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与对象对应的数据记录,所以此时对象处于游离态

与持久对象关联的 Session 被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。

脱管对象特点:

(1) 本质上和瞬时对象相同

(2) 只是比爱瞬时对象多了一个数据库记录标识值 id.

持久对象转为脱管对象:

当执行 close() 或 clear(),evict() 之后,持久对象会变为脱管对象。

瞬时对象转为持久对象:

通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把脱管对象变为持久对象。



示例:

Session session=factory.openSession();
User user=new User(); 
//user对象处于临时状态。
user.setName("张三");
user.setAge(18);
Transaction tran=Session.beginTransaction();
session.save(user);
//user对象转化为持 久状态。
tran.commit(); 
session.close();
//user对象转化为游离状态。
user.setName(" 李四"); 
Session session2=factory.openSession();
Transaction tran2=Session2.beginTransaction();
Session2.update(user);
//user对象 转化为持久状态。
tran2.commit();(游离状态中对象的变动在再次持久时会被持久化到数据库) 
Transaction tran3=Session.beginTransaction();
Session2.delete(user);
//user对象转 化为临时状态。
tran3.commit();
session2.close();

Session的不同操作对对象状态的影响:
Session 的save()方法
save()方法将一个临时对象转变为持久对象。
Session的update()方法
update()方法 将一个游离对象转变为持久对象。
Session的lock()方法
调用lock()方法将对象同Session相关联而不强制更新。
Session 的merge()方法
拷贝指定对象的状态到具有相同对象标识符的持久对象。
Session的saveOrUpdate()方法
saveOrUpdate() 方法对于临时对象,执行save()方法,对于游离对象,执行update()方法。

Session的load()和get()方法
load() 方法和get()方法都可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。
Session的 delete()方法
delete()方法用于从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条 delete语句。如果传入的参数是游离对象,先使分离对象与Session关联,使它变为持久化对象,然后才计划执行一个delete语句。
Session 的evict()方法
evict()方法从Session的缓存中删除一个持久对象。


0 0
原创粉丝点击