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