• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

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

JAVA web前端中文站 2年前 (2017-10-07) 777次浏览 已收录 0个评论

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

更多精彩内容请看 web 前端中文站
http://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 所托管

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


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Hibernate 的三种状态:transient(瞬时状态)、persistent(持久化状态)、detached(游离状态)
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址