Hibernate对象的状态
应用的场景
假设一个班的所有学生要把考试的成绩同步到数据库表中,如果每一个学生和数据库交互一次,那么有60个学生,则需要更数据库交互60次,但是这样的效率是特别的低,那么怎么处理更加高效呢? 在hibernate中是用什么解决的呢?为了这个问题Hibernate就有了对象状态的这个概念。下面就以我们熟悉的Person表。来进行介绍关于hibernate中对象状态的一些原理。
对象的状态值
在Hibernate中,对象的状态主要由以下几种状态:
- 临时状态
刚刚创建的对象 - 持久状态
经过session.load(),session.get().session.save(),session.update(),方法都是可以把一个对象转变成托管状态。 - 脱管状态
经过session.clear(), session.evict().session.cllose(), 方法可以将一个持久化状态转变成托管状态。
案例一
我们的Person对象:
HibernateUtils类,用户加载配置文件:
其他的配置文件在 上一篇文章《Hibernate框架——基本操作(一)》中有具体的操作,所以这里就不再用过多的篇幅进行表述,下面直接看测试代码:
对于上面的这段代码,要进行的操作是将一条记录保存到数据库中,那么对各条的语句进行对象状态的分析,可以得到如下所示的分析图:
说明:
- 上图中做步骤1,2,3这三个代码对应的操作时,对象的状态称为临时对象,其特征是该对象与hibernate没有关系。
- 当执行第4步的时候,person对象由临时状态转化成持久化状态,这个时候数据库没有对应的数据,但是该对象在hibernate内部。
- 当执行第5步的时候,事务提交了,该对象还是持久化状态的对象,数据库中有对应的值了。
- 当执行完第6步的时候,session关闭了,该的对象成为脱管状态的对象。
案例二
|
|
说明:
1. session.get() 方法提取出来的是一个持久化状态的对象
2. 事务提交的时候,hibernate内部自动更新
案例三
|
|
说明:
在从数据库中取出的记录在hibernate中保存,并且还有一个副本,hibernate对比副本和原纪录,当没有对记录进行修改的操作,就不会进行update的更新操作,这个的操作虽然增加了内存的消耗,但是所以减少了和数据库的交互,以牺牲内存的代价,换取执行的效率。
下面是分析图:
案例四
|
|
说明:
- 该例子中对象的状态经过了由持久化->脱管->持久化的转变
- 当事务提交的时候,hibernate内部只管持久化状态的对象,对于临时状态和脱管状态是不管的。
对象转化图
总结
- 可以通过session.get,session.save,session.update,方法把一个对象变成持久化状态的对象
- 可以通过session.close session.evict session.clear方法把一个对象变成脱管状态的对象