最近项目中用到了Hibernate,关于Hibernate的三种持久状态进行了复习。本文总结了Hibernate的三种状态。
Hibernate的三种状态
- transient(瞬时状态):瞬时状态就是刚new出来一个对象,还没有被保存到数据库中
- persistent(持久化状态):持久化状态就是已经被保存到数据库中
- detached(游离状态):离线状态就是数据库中有,但是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(游离状态)
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/java/251663.html