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

最近项目中用到了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所托管

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

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

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/java/251663.html

(0)
上一篇 2022年5月3日 09:20
下一篇 2022年5月3日 09:24

相关推荐

发表回复

登录后才能评论