HIbernate的脏数据检测和延缓加载

时间:2021-02-28 20:09:34

脏数据监测

在一个事务中,加载的数据,除了返回给用户之外,会复制一份在session中,在事务提交时,会用session中的备份和用户的数据进行比对,如果用户的数据状态改变,
则用户的数据即为:脏数据。此时,hibernate会按照脏数据的的数据状态同步数据库。
细节:适用范围==只能检测,事务中自己加载的数据。如果要更新的数据和事务无关,则需要明确的session.update();否则,session.update()可以省略。

延迟加载:

在一个事务中,查询时,不是所有属性都立即查询,有些属性的查询被延缓,在事务中确实使用的该属性,才会去查询,否则,则不在查询该属性。

目的:减少与数据库的通信次数。提高查询效率。

发生延迟加载的情况:
1.集合类型的关系属性会发生延迟加载现象。
2.普通属性也会被延缓:session.load(User.class,1);//会延缓查询普通属性

延迟加载异常:

在事务外部,初次使用了被延迟着的属性,会由于事务结束,session关闭,连接关闭,无法再次发起查询。
解决方案:
*在事务内部强制加载
*关闭延迟加载特性(不建议)
@OneToMany(fetch=FetchType.EAGER)

@ManyToMany(fetch=FetchType.EAGER)
*openSessionInView