知道美河 | 上传资料 | VIP申请 | 精品课程 | 资料搜索 | 问题反馈 | 会员手册 | 积分消费 | 积分充值 | 帐号保护
美河学习学习在线赞助VIP

美河学习在线(主站) eimhe.com

用户名  找回密码
 建立账号
查看: 8693|回复: 6

[原创] Hibernate 对象状态的理解

[复制链接]
发表于 2006-12-31 10:43:00 | 显示全部楼层 |阅读模式
Hibernate对象的三种状态:

瞬时的(Transient)
由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时的(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时对象在程序中没有被引用,它会被Java垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态(Hibernate会自动执行必要的SQL语句)。

持久的(Persistent)
一个持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session的作用范围内。Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象的状态同步到数据库,开发者不需要手动执行UPDATE语句。同样的,将一个对象变为瞬时(Transient)状态,也不需要手动执行DELETE语句。

分离的(Detached)
与持久对象关联的Session被关闭后,对象就变为分离的(Detached)的。 对分离对象的引用仍然是有效的,对象可以继续被修改。分离对象如果重新关联到某个新的Session上, 会再次转变为持久的(在Detached其间的改动将被持久化到数据库中)。

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的缓存中删除一个持久对象。

评分

2

查看全部评分

发表于 2006-12-31 11:23:53 | 显示全部楼层
非常强烈的支持一下。。。。

决定永久保存这个帖子。。。。
发表于 2006-12-31 11:33:58 | 显示全部楼层
发表于 2006-12-31 12:22:19 | 显示全部楼层
发表于 2006-12-31 14:14:48 | 显示全部楼层
发表于 2006-12-31 14:16:53 | 显示全部楼层
发表于 2006-12-31 14:29:20 | 显示全部楼层
您需要登录后才可以回帖 登录 | 建立账号

本版积分规则

 
QQ在线咨询

QQ|小黑屋|手机版|Archiver|美河学习在线 ( 浙网备33020302000026号 )

GMT+8, 2025-5-28 14:58

Powered by Discuz!

© 2001-2025 eimhe.com.

快速回复 返回顶部 返回列表