Hibernate的三种状态:transient(瞬时状态)、persistent(持久化状态)、detached(游离状态)

最近项目中用到了Hibernate,关于Hibernate的三种持久状态进行了复习。本文总结了Hibernate的三种状态。

更多精彩内容请看 web前端中文站
www.lisa33xiaoq.net 可按Ctrl + D 进行收藏

Hibernate的三种状态

  • transient(瞬时状态):瞬时状态就是刚new出来一个对象,还没有被保存到数据库中
  • persistent(持久化状态):持久化状态就是已经被保存到数据库中
  • detached(游离状态):离线状态就是数据库中有,但是session中不存在该对象

它们之间的转换可以用下图来说明:

Hibernate的三种状态:transient(瞬时状态)、persistent(持久化状态)、detached(游离状态)

transient(瞬时状态)也称作临时状态。

当new出来一个新对象,还没有保存到数据库中的时候,就是transient状态。代表的例子如下:

 session = HibernateUtil.openSession(); 
 session.beginTransaction(); 
 User user = new User(); 
 user.setUsername("web前端中文站"); 
 user.setPassword("www.lisa33xiaoq.net"); 
 user.setBorn(new Date()); 
 /*  *  以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,*/
 /*即在session的  *  缓存中还不存在user这个对象,当执行完save方法后,*/
 /*此时user被session托管,并且数据库中存在了该对象  */  
 /*user就变成了一个Persistent(持久化对象)  */

上面的状态就是瞬时状态。如果我们执行了save或saveOrUpdate方法就会变成持久状态。代表的例子如下:

 //在上面的代码后边加上保存方法  
 ession.save(user); 
 session.getTransaction().commit();

当临时状态的对象被执行save之后,就会被session托管,在session中有一个map存放着user对象,也就是说user对象被session引用着,被session纳入管理了。此时的user就处于持久状态了。

当持久状态的对象user,在session关闭之后就会变成有游离状态。

如果一个对象已经是持久化状态了,那么此时对该对象进行各种修改,或者调用多次update、save方法时,hibernate都不会发送sql语句,只有当事物提交的时候,此时hibernate才会拿当前这个对象与之前保存在session中的持久化对象进行比较,如果不相同就发送一条update的sql语句,否则就不会发送update语句。

当session调用load、get方法时,此时如果数据库中有该对象,则该对象也变成了一个持久化对象,被session所托管。

总结

  • 对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是瞬时对象(Transient)
  • 瞬时对象调用save方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句
  • 离线对象就是,数据库存在该对象,但是该对象又没有被session所托管

【注:本文源自网络文章资源,由站长整理发布】

0
如无特殊说明,文章均为原作者原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到