native 查询正在清除二级缓存条目。来自 7 年前的 hibernate 论坛的回答说 HQL 更新查询也会清除二级缓存。但这仍然是真的吗?
由于 HQL 查询具有要更新的确切字段,以及在哪个实体中,我认为它不应该像常规 session.save(..)
那样难以执行调用。
最佳答案
Native queries are clearing the 2nd level cache entries.
- native 查询(实际上这仅适用于 native 插入/删除/更新,而不是查询)使所有缓存(WHOLE CACHE)的二级缓存条目无效。我已经用当前稳定的 Hibernate 版本:4.1.9 验证了这一点。这是明智的,因为 Hiberante 不可能知道数据库中发生了什么变化,所以唯一的选择是使整个二级缓存无效。在某些严重依赖二级缓存的系统中,这可能是一个严重的问题。
虽然有可能指定二级缓存中的内容应该无效(或者甚至指定不从缓存中逐出任何内容)。 看看很棒的博文 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();
这将使“仅”Person 实体缓存失效。
当涉及到 HQL 时,我不知道有任何可能阻止 Hibernate 使特定实体的二级缓存无效。
关于java - HQL 是否更新清除二级缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6095173/