java – HQL是否更新清除二级缓存?

本机查询清除第二级缓存条目. 7岁的休眠论坛的一个答案说,HQL更新查询也清除了第二级缓存.但这还是真的吗?

由于HQL查询具有要更新的确切字段,并且在哪个实体中,我认为不会像调用常规session.save(..)那样难以表现.

最佳答案

Native queries are clearing the 2nd level cache entries.

>本地查询(实际上这仅适用于本机插入/删除/更新,而不是查询)使所有高速缓存(全局缓存)的第二级缓存条目无效.我已经验证了当前稳定版本的Hibernate:4.1.9.这是明智的,因为Hiberante不可能知道DB中发生了什么变化,所以唯一的选择是使整个二级缓存无效.在一些依赖于二级缓存的系统中,这可能是一个严重的问题.

尽管有可能指定什么从第二级缓存应该无效(甚至指定没有从缓存驱逐).
看看伟大的博客文章http://www.link-intersystems.com/bin/view/Blog/Hibernate%27s+second+level+cache+and+native+queries这里是彻底解释.

为了防止Hibernate使缓存中的任何东西无效:

SQLQuery sqlQuery = session.createSQLQuery("ALTER SESSION SET NLS_COMP = 'BINARY'");
sqlQuery.addSynchronizedQuerySpace("");  
int updatedEntities = sqlQuery.executeUpdate();

指示Hibernate仅使Person实体缓存无效:

SQLQuery sqlQuery = session.createSQLQuery("UPDATE PERSON SET ... WHERE ...");
sqlQuery.addSynchronizedEntityClass(Person.class);
int updatedEntities = sqlQuery.executeUpdate();

An answer from the hibernate forum that is 7 years old says that HQL
update queries also clear the 2nd level cache. But is this still true?

> HQL只会使与您正在执行某些插入/更新/删除的实体相关的第二级缓存区域无效.这是有道理的,因为Hibernate知道哪些实体受到HQL的影响,它只能清除该实体的第二级缓存区域.

例:

entityManager.createQuery("delete from Person p where p.id = 1").executeUpdate();

这将使“实体”缓存无效.

对于HQL来说,我不知道有什么可能防止Hibernate使特定实体的二级缓存失效.

转载注明原文:java – HQL是否更新清除二级缓存? - 代码日志