【发布时间】:2011-12-08 14:01:28
【问题描述】:
我已经发现有很多关于 SO 上的缓存和休眠的问题,但是我找不到解决问题的方法。大多数问题都是直接使用hibernate而不使用JPA。
我们将 Spring 与 Hibernate 配置为 JPA 提供程序。该应用程序本身是一个使用 JSF 的 Web 应用程序。底层数据库是 SQL Server 2008。
根据 JPA 规范,我们将以下内容添加到 persistence.xml。
<shared-cache-mode>NONE</shared-cache-mode>
Hibernate 似乎或多或少地忽略了它。 Hibernate documentation 表示这将禁用二级缓存。但是,我们的应用程序需要数据库中的最新数据,因为第三个应用程序将在那时结束时更改一些数据。
如何禁用缓存?我们通过以下查询以 JPA 方式获取数据:
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager em;
...
return em.createQuery("SELECT mt FROM " + MyTable.class.getSimpleName() + " mt",
MyTable.class).getResultList();
@axtavt 我启动应用程序并在浏览器中加载一个正在查询表的页面。 我切换到我的 DBMS 并在表上进行更新。 我打开第二个浏览器,它仍然显示旧数据而不是更新的数据。
更新
我进行了一些进一步的测试。我正在使用@PersistenceContext 和EXTENDED。我在这里添加了它。如果我删除它,但我会遇到不同的问题......
【问题讨论】:
-
到底是什么问题?为什么你认为 Hibernate 会忽略该设置?
-
请澄清Hibernate 似乎或多或少地忽略它:举例说明问题。二级缓存在这里应该不是问题,因为除了启用二级缓存之外,您还必须设置可缓存的实体和查询以使其工作。关于二级缓存的一篇很好的文章可以找到here
-
@axtavt 我将更新添加到主帖中。
-
@UdoHeld:您是否尝试过打开查询日志记录(
hibernate.show_sql=true、hibernate.format_sql=true)?打开页面时,您是否在日志输出中看到查询?直接在数据库中执行查询会产生什么结果? -
@Udo Held:确保不是浏览器缓存问题,并且更新事务已正确提交。