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

标签 java hibernate

native 查询正在清除二级缓存条目。来自 7 年前的 hibernate 论坛的回答说 HQL 更新查询也会清除二级缓存。但这仍然是真的吗?

由于 HQL 查询具有要更新的确切字段,以及在哪个实体中,我认为它不应该像常规 session.save(..) 那样难以执行调用。

最佳答案

Native queries are clearing the 2nd level cache entries.

  1. 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?

  1. 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/

相关文章:

java - JPA Hibernate 意外获取 @OneToOne 映射实体的记录,我应该将映射更改为 @ManyToOne 还是执行其他操作?

java - JPA @OneToOne 具有相同类型

java - 优化 hibernate

java - c3p 0's max number of connections doesn' t 在 Linux 中工作

java - 使用 RSA 加密字符串并将 Java 中的 key 封装到文件中

java - Hibernate OneToMany/ManyToOne 错误

mysql - 保存到数据库的日期值与应有的值不同

java - 如何使用 java 截断 Cassandra 中的表

java - com.esotericsoftware.kryo.KryoException : java. lang.UnsupportedOperationException : java. io.StringReader,这是一个可关闭的资源

java - 使复选框返回一个 int [Java]