在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关.
分别是瞬时(Transient),持久太(persistent)和游离态(Detached)
瞬时状态
由new命令开辟内存的java对象.例如:Student
stu= newStudent();若没有变量对他引用,则被jvm回收.瞬时对象在内存中孤立存在,他的意义仅是携带信息的载体,不和数据库中的数据有任何的关联。通过session的save()和saveOrUpdate()方法可以把一个瞬时对象与数据库相关联,并把瞬时对象携带的信息通过配置文件所做的映射插入到数据库中,这个瞬时对象就成了持久化对象,拥有和数据库记录相同的id标示(Hibernate自动将id赋予它)
瞬时特点:
(1)不和Session实例关联
(2)在数据库中没有和瞬时对象关联的记录
持久态
持久的实例在数据库中有对应的记录.是Session
和Transction相关联.在sessin中,持久对象改变不会马上对数据变更.而必须在Transcation终止,commit后,才与数据库进行同步.在此之前的持久太对象为脏对象.
使用 find,get ,load
和iterater等方法查询的数据,都是持久对象.
若一个瞬时对象被持久对象引用,则该对象也会变为持久对象.
如果使用delete()方法,它就会变为瞬时对象;当一个Session执行close()或clear()、evict()之后,持久对象就会变为托管对象。
持久特点:
(1)和Session实例关联
(2)在数据库中有和持久对象关联的记录
代码示例: public void testSave() { Session session =null; Transaction tx=null ; try{ session= HibernateUtils.getSesion(); tx =session.beginTransaction(); //transient 瞬时状态 User user= new User(); user.setName("sdf"); user.setPassword("hanhan23"); user.setCreateTime(new Date()); //persistent, ,session引用,po持久 session.save(user); //被引用,成为持久状态//但是为脏对象 user.setName("lisd"); tx.commit();// }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ HibernateUtils.closeSession(session); } //deteached状态关闭sesion后 }
以上示例演示瞬时态转为持久态对象
托管状态
与持久对象关联的Session被关闭后,对象变为托管。对托管对象的引用依然有效,对象可继续被修改。托管对象如果重新关联到某个新的Session上,会再次转变为持久的。托管状态期间的改动将会被持久化到数据库。
托管状态拥有数据库标识id,所以它可以通过update()、saveOrUpdate()和lock()等方法,再度与持久层关联。
托管特点:
(1)本质上和瞬时对象相同
(2)只是比瞬时对象多了一个数据库记录标识值id
小结:
通过以上三种的对比,认识到,Hibernate中的对象是在session的管理进行数据的持久更新.状态之间的转换是与对象的生命周期息息相关.
刚创建的内存中为游离态,若一旦被session保存为持久态(或被session引用).一旦sesion关闭或delete变为托管.学习之初,还请多多提意见.