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

JAVA herman 1444浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

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

Hibernate的三种状态

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

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

Hibernate session 状态转换

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

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

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

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

//在上面的代码后边加上保存方法
session.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所托管

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Hibernate的三种状态:transient(瞬时状态)、persistent(持久化状态)、detached(游离状态)