hibernate持久化状态

来源:互联网 发布:扫描编辑软件 编辑:程序博客网 时间:2024/06/06 16:36

hibernate持久化状态有三种:

·瞬时状态(Transient Objects)

使用new操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说,它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其他对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。

·持久化状态(Persist Objects)

持久化实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久化实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的insert、update和delete语句把内存中的状态同步到数据库中。

离线对象(Detached Objects)

Session关闭之后,持久化对象就变成离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

下面一张图展现了持久化对象的整个生命周期:

                                                 

给大家解释下这张图,大家就能搞清楚这几个状态啦。

1)当我们通过java的new关键字来生成一个实体对象时,这是这个实体对象就处于自由状态。比如:

//Transient状态User user=new User();user.setName("冯坤贵");user.setPassword("123");user.setCreateTime(new Date());user.setExpireTime(new Date());

此时的user只是通过JVM获得了一块内存空间,并没有通过Session对象的save()方法保存进数据库,因此也没有纳入到Hibernate的缓存管理中,也就是说user对象现在还自由的游荡于hibernate缓存管理之外。可以看出,自由对象的最大特点是,不和Session实例关联,在数据库中不存在一条与它对应的记录。    

2)持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这个时候对该对象的任何修改,都会在清理缓存时同步到数据库中。如下:

//Persistent状态//Persistent状态的对象,当对象的属性发生改变的时候//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步。session.save(user);user.setName("李四");tx.commit();
这个时候,user对象通过save方法保存进数据库,成为持久化对象,然后通过load方法再次加载它,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时,当执行tx.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到数据库中。

作为持久化的对象总是与Session和Transaction相关联,在一个Session中,对持久化对象的改变不会马上对数据库进行变更,而必须是在Transaction终止,也就是在执行commit之后,才在数据库中真正运行SQL进行变更,持久化对象的装填才会与数据库进行同步。

3)当一个持久化对象,脱离开Hibernate的缓存管理后,它处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会再数据库中出现与它对应的数据记录。

//detached状态//将detached状态的对象重新纳入session管理//此时将变成persistent状态的对象//persistent状态的对象保存时,会同步数据库。user.setName("王五");try{session=HibernateUtils.getSession();session.beginTransaction();session.update(user);session.getTransaction().commit();}catch(Exception e){e.printStackTrace();session.getTransaction().rollback();}finally{HibernateUtils.closeSession(session);}
当session关闭后,user对象就不在Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与user对象对应的数据记录,所以此时user对象处于游离状态。其实,脱管对象本质上和瞬时对象相同,知识比瞬时对象多了一个数据库记录标示值id。


一开始的时候,对这几个状态之间的转换傻傻的分不清,这么一总结清晰多了,希望也可以帮到你哦。


 

          

0 0
原创粉丝点击