- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
hibernate中session的三种状态
Hibernate中的对象有三种状态: 瞬时状态 Transient ,持久状态 Persistent ,
1. 脱管状态 Detached
1. 1. 瞬时状态 Transient
由 new 命令开辟内存空间的 Java 对象,也就是平时所熟悉的普通 Java 对象。
如: Student stu new Student ;
瞬时对象特点:
1 不和 Session 实例关联
2 在数据库中没有和瞬时对象关联的记录
2. 2. 持久状态 Persistent
持久的实例在数据库中有对应的记录,并拥有一个持久化标识 identifier .
持久对象总是与 Session 和 Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏 dirty 对象。
瞬时对象转为持久对象:
1 通过 Session 的 save 和 saveOrUpdate 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
2 使用 fine ,get ,load 和 iterater 待方法查询到的数据对象,将成为持久化对象。
持久化对象的特点:
1 和 Session 实例关联
2 在数据库中有和持久对象关联的记录
3. 3. 脱管状态 Detached
与持久对象关联的 Session 被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。
脱管对象特点:
1 本质上和瞬时对象相同
2 只是比爱瞬时对象多了一个数据库记录标识值 id.
持久对象转为脱管对象:
当执行 close 或 clear ,evict 之后,持久对象会变为脱管对象。
瞬时对象转为持久对象:
通过 Session 的 update ,saveOrUpdate 和 lock 等方法,把脱管对象变为持久对象。
三种状态相互转化的状态图如下:
4 .结合 save ,update ,saveOrUpdate 方法说明对象的状态
1 Save 方法将瞬时对象保存到数据库,对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直位于 Session 的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用 save 或 update 方法是没有意义的。如:
Student stu new Strudnet ;
stu.setCarId “座机电话号码7” ;
stu.setId “100” ;
// 打开 Session, 开启事务
session.save stu ;
stu.setCardId “座机电话号码” ;
session.save stu ; // 无效
session.update stu ; // 无效
// 提交事务,关闭 Session
2 update 方法两种用途重新关联脱管对象为持久化状态对象,显示调用 update 以更新对象。调用 update 只为了关联一个脱管对象到持久状态,当对象已经是持久状态时,调用 update 就没有多大意义了。如:
// 打开 session ,开启事务
stu Student session.get Student.class,”123456” ;
stu.setName “Body” ;
session.update stu ; // 由于 stu 是持久对象,必然位于 Session 缓冲中,
对 stu 所做的变更将 // 被同步到数据库中。所以 update 是没有意义的,可以不要这句效果一样的。
// 提交事务,关闭 Session
Hibernate 总是执行 update 语句,不管这个脱管对象在离开 Session 之后有没有更改过,在清理缓存时 Hibernate 总是发送一条 update 语句,以确保脱管对象和数据库记录的数据一致,如:
Student stu new Strudnet ;
stu.setCarId “1234” ;
// 打开 Session1, 开启事务
session1.save stu ;
// 提交事务,关闭 Session1
stu.set “4567” ; // 对脱管对象进行更改
// 打开 Session2, 开启事务
session2.update stu ;
// 提交事务,关闭 Session2
注:即使把 se
文档评论(0)