持久层框架hibernate遇到的小问题

Hibernate未进行save操作事务提交后DB却更新了,今天工作时,遇到了这个问题,很有意思,但原因很简单。

详细叙述问题

  • 没有save操作,事务提交后,db更新了。

原因

  • 一开始我以为是上了更新锁的原因 ,我便注释掉了更新锁。
Criteria criteria = getSession()
                .createCriteria(DemoModel.class)
                .add(Restrictions.eq("xId", xId))
//              .setLockMode(LockMode.UPGRADE_NOWAIT)
                .setMaxResults(1);

运行结果没有更新,那是肯定的,因为不上更新锁,即便是save了,也不会更新。

  • 后来搜了一下才知道,原来是hibernate的快照机制。即一级缓存会将数据库查出的数据保存快照,如果事务提交后,数据与快照中的不符合,就会进行更新操作。

总结

之前我只形而上学知道持久层框架是有一级缓存和二级缓存的,但随着使用memcache、redis等缓存,就忽略了这些。具体想了解的话,搜索hibernate(或mybatis)一级缓存、二级缓存,这里就不详细解释了。

你可能感兴趣的:(持久层框架hibernate遇到的小问题)