那时初入职场,mybatis并没有在中国有绝对的占有率。我一个人在小公司里想用什么就用什么,所以理所当然的用起了hibernate。转眼间已经过了很多年了,最近有朋友介绍项目,时间宽裕,技术路线自己定。我又把hibernate拿出来用用。
曾经对部分hibernate的理解已变淡。spring配置方式也从xml变为注解又加强为spring boot。但是hibernate的脏检查是不得不提的重点。现在网上这方面的总结很少都是片段提到,甚至在文档中的介绍也很简单,我看了几遍也没得到全面的认识。因此我把最近的理解写下来。
hibernate的脏检查分为 扫描和触发
扫描就是加载时保存一份快照,提交时把所有的实体和之前的快照对比,不同的说明就是脏数据,需要更新到数据库。
触发就是程序调用set时,如果值变了就标记为脏 ,需要更新到数据库 。
默认为扫描,听起来就性能很差,特别是实体比较多的时候,当然一般情况也性能也不会很差。在hibernate3以前,只有扫描这种模式。
触发分两种,一种是加载时织入触发代码,一种是编译时织入触发代码。
加载时织入触发代码只有spring中开启@EnableLoadTimeWeaving加配置才会生效(这个配置未来会取消)
编译时织入只需配置插件即可使用,在hibernate文档的Bytecode Enhancement栏可以看到。
加载时织入和编译时织入可以同时存在,当加载时织入程序检测到实体已经被编译时织入增强则不会继续增强。