欢迎来到天天文库
浏览记录
ID:51795015
大小:64.00 KB
页数:4页
时间:2020-03-15
《浅谈对象在Hibernate中的三种状态.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、浅谈对象在Hibernate中的三种状态一.瞬时状态(Transient) 由new命令开辟内存空间的Java对象,也就是平时所熟悉的普通Java对象。如:Studentstu=newStudent(); 瞬时对象特点:1.不和Session实例关联2.在数据库中没有和瞬时对象关联的记录 二.持久状态(Persistent) 持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Tr
2、ansaction终止,也就是执行commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏(dirty)对象。 瞬时对象转为持久对象的方法:1.通过Session的save()和saveOrUpdate()方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。2.使用fine(),get(),load()和iterater()待方法查询到的数据对象,将成为持久化对象。 持久化对象的特点:1.和Session实例关联2.在数据库中有和持久对象关联的记录 三.脱管状态(Deta
3、ched) 与持久对象关联的Session被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。 脱管对象特点:1.本质上和瞬时对象相同1.只是比爱瞬时对象多了一个数据库记录标识值id 持久对象转为脱管对象的方法: 当执行close()或clear()、evict()之后,持久对象会变为脱管对象。 瞬时对象转为持久对象的方法: 通过Session的update()、saveOrUpdate()和lock()等方法,把脱管对象变为持久对象。 三种对象的转换图: 四.结合save()、update()、saveOrUp
4、date()方法说明对象的状态 1Save()方法将瞬时对象保存到数据库,对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直位于Session的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用save()或update()方法是没有意义的。如:Studentstu=newStrudnet();stu.setCarId(“200234567”);stu.setId(“100”);//打开Session,开启事务session.save(stu);stu.setCardId(“20076548”);sessio
5、n.save(stu);//无效session.update(stu);//无效//提交事务,关闭Session 2update()方法两种用途重新关联脱管对象为持久化状态对象,显示调用update()以更新对象。调用update()只为了关联一个脱管对象到持久状态,当对象已经是持久状态时,调用update()就没有多大意义了。如://打开session,开启事务stu=(Student)session.get(Student.class,”123456”);stu.setName(“Body”);session.update(stu);//由于st
6、u是持久对象,必然位于Session缓冲中,对stu所做的变更将//被同步到数据库中。所以update()是没有意义的,可以不要这句效果一样的。//提交事务,关闭Session Hibernate总是执行update语句,不管这个脱管对象在离开Session之后有没有更改过,在清理缓存时Hibernate总是发送一条update语句,以确保脱管对象和数据库记录的数据一致,如:Studentstu=newStrudnet();stu.setCarId(“1234”);//打开Session1,开启事务session1.save(stu);//提交事务,
7、关闭Session1stu.set(“4567”);//对脱管对象进行更改//打开Session2,开启事务session2.update(stu);//提交事务,关闭Session2注:即使把session2.update(stu);这句去掉,提交事务时仍然会执行一条update()语句。 如果希望只有脱管对象改变了,Hibernate才生成update语句,可以把映射文件中标签的select-before-update设为true,这种会先发送一条select语句取得数据库中的值,判断值是否相同,如果相同就不执行update语句。不
8、过这种做法有一定的缺点,每次update语句之前总是要发送一条多余的select语句,影响性能
此文档下载收益归作者所有