刚刚开始的时候觉得这个快照区很难理解,在网上看了很多博客之后,开始明白了。我是结合 ado.net 理解的,在ado.net 中有一个类,
叫 sqlcommandbuilder,在我看来,他就是 ado.net 中和 hibernate 快照区对应的东西,这个 sqlcommandbuilder 可以构建 sql 语句,并且当调用update 方法之后,可以将数据库中的信息更新(包括更新和删除),其中还必不可少的一个枚举类,就是行状态位 rowstate类,我将这个行状态位和hibernate 的对比(对比缓存区和快照区)当成对应。只不过,当刷新缓存区时,hibernate 它做了一个比对缓存区和快照区的内容(如果发现不同,就更新快照区,并存储一条 updata 的 sql 语句,如果执行的不是刷新操作,而是提交事务操作,那么不仅会存储这个updata语句,还会发送到数据库执行这个updata 的 sql),而 ado.net 没有进行比对,而是进行了记录(即改变了该行的 rowstae 值),最后 sqlcommandbuilder 根据这个状态位和主键,更新到数据库,其实,在某种角度下,比对也是一种做记录(和修改行状态位类似),直到提交事务,就更新到数据库。
加上一句,快照我理解为数据库的快照(最初是数据库某些行的的快照,然后一顿操作,这时就不再是数据库的快照了,但提交事务后,又成了数据库的一部分行的快照了。)
关于sqlcommandbuilder可以看这篇博客【sqlcommandbuilder类】
还有这个类【rowsate类】
也许我讲的不够明白,但是目前的理解就是这样。
以上就是hibernate 中一级缓存和快照区的理解的详细内容。