Hibernate-对象状态的转换
一.hibernate对象的三种状态
1.瞬时状态:在数据库没有对应的标识符(ID),但没有在session缓存中
2.持久化状态:在数据库有对应的标识符(ID),也有在session缓存中
3.游离状态:在数据库有对应的标识符(ID),但没有在session缓存中
二.注意的事项
1.瞬时态 --> 持久态:可通过save(),执行完save会打印一条语句,其实是在生成ID并且该对象已经在session缓存中了,即持久态
2.游离态 --> 持久态:可通过update()方法,只是把对象加载到session缓存,没有做其他的变化,也不会给他生成ID
3.只有当执行commit(清理缓存)时持久化才会同步到数据库中,在此之前对象的改变不会影响对应数据库的数据,原理:
脏检查:
Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照。当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库。
4.当session执行close方法,session缓存的所有对象都被移除,它会先清理缓存,在执行sql语句
5.调用delete()删除游离对象时,当commit时执行sql的删除语句,对象对应的数据库数据没有了,此时对象是瞬时态
6.需要同步到数据库的对象,要处于持久态
图片来自:https://blog.csdn.net/fg2006/article/details/6436517?utm_source=copy