我向数据库添加实体,它能正常工作。但是当我检索列表时,我获取到的是旧实体,直到我卸载应用程序并重新部署才会显示我添加的新实体。这意味着我的实体默认被缓存了吗?但是,我没有在persistence.xml或任何其他文件中设置缓存实体。
我甚至尝试调用flush()、refresh()和merge(),但仍然只显示旧实体。我是否遗漏了什么?请帮助我。
我向数据库添加实体,它能正常工作。但是当我检索列表时,我获取到的是旧实体,直到我卸载应用程序并重新部署才会显示我添加的新实体。这意味着我的实体默认被缓存了吗?但是,我没有在persistence.xml或任何其他文件中设置缓存实体。
我甚至尝试调用flush()、refresh()和merge(),但仍然只显示旧实体。我是否遗漏了什么?请帮助我。
欢迎使用JPA。如果您在JPA之外更新数据库,除非您知道自己在做什么并非常小心,否则您将会遇到很大的问题。这意味着您必须找出如何刷新缓存实体以便它们可以重新加载。
基本上,如果可能的话,请不要在JPA之外更新实体;如果您确实需要这样做,则很可能需要了解您特定的JPA提供程序使用的缓存模型的工作原理。如果您需要经常在JPA之外进行更新,那么JPA可能不是适合您的最佳选择。
这意味着我的实体默认会被缓存吗?
JPA 1.0并没有定义L2缓存(“共享缓存”),JPA 1.0只定义了一个L1缓存(“事务缓存”),但是JPA提供程序可以支持共享对象缓存,并且大多数提供程序都支持。如TopLink Essentials就支持通过JPA扩展来实现L1和L2缓存(每个JVM)。
现在,正如在这篇很好的文章Understanding the cache of TopLink Essentials(GlassFish JPA)中所解释的:
因此,您的设置肯定还有其他问题。您可以尝试通过添加以下属性来禁用共享会话缓存(仅限于测试目的):
<property name="toplink.cache.shared.default" value="false"/>
但我会感到惊讶,如果这改变了什么的话。正如我所说,我认为还有其他问题。
PS:这并没有回答问题,但是,如果您正在使用GlassFish v3,为什么不使用EclipseLink?
更新:回答OP的评论
那么,如果我持久化雇员记录,则可以在数据库中看到它,但在部门的雇员集合中却无法看到它,直到我明确将其添加到雇员集合中。这一步是必需的吗?
嗯,如果您在Java层面上不创建实体之间的链接,JPA就无法在数据库中创建该链接(JPA只能执行您告诉它要执行的操作)。因此,是的,您需要创建链接,并且在双向关联的情况下,甚至需要设置链接的两个方面(例如将employee
添加到Department
的雇员集合中并设置Employee
的department
)。
我正在使用 eclipselink 和 ejb 的上下文,我发现在查询实体时,它会自动被缓存,但是我也运行了一个函数来更改数据库中的记录,所以我可能会得到缓存中的旧数据,因此我通过向文件 persistence.xml
添加以下内容来禁用缓存:
<shared-cache-mode>NONE</shared-cache-mode>
它确实有效!
您是否正在使用EntityManager?如果没有,请尝试一下http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html。
您是否在使用数据源来管理与数据库的连接?您也应该尝试使用它。这是在您的服务器中配置的XML文件。提供更多关于您的架构的信息,以便我们可以为您提供帮助。