默认情况下,实体是否在 jpa 中缓存?
我将实体添加到我的数据库中,它工作正常。但是当我检索列表时,我会得到旧实体,我添加的新实体不会显示,直到我取消部署应用程序并再次重新部署它。这意味着我的实体是否默认缓存?但是,我没有为持久性中的缓存实体进行任何设置.xml或任何此类文件。
我甚至尝试过调用 flush()、refresh() 和 merge()。但它仍然只显示旧实体。我错过了什么吗?请帮帮我。
我将实体添加到我的数据库中,它工作正常。但是当我检索列表时,我会得到旧实体,我添加的新实体不会显示,直到我取消部署应用程序并再次重新部署它。这意味着我的实体是否默认缓存?但是,我没有为持久性中的缓存实体进行任何设置.xml或任何此类文件。
我甚至尝试过调用 flush()、refresh() 和 merge()。但它仍然只显示旧实体。我错过了什么吗?请帮帮我。
欢迎来到JPA。如果你使用它,这意味着如果你在JPA之外更新数据库,你会遇到巨大的问题,除非你知道你在做什么并且非常小心。这意味着您必须弄清楚如何刷新任何缓存的实体,以便可以重新加载它们。
基本上,如果您可以帮助JPA之外的实体,请不要更新它,如果您这样做,您可能必须进入特定JPA提供程序使用的缓存模型的工作原理。如果您需要在JPA之外进行大量更新,那么JPA可能不是您的正确选择。
这意味着我的实体是否默认缓存?
JPA 1.0 没有定义 L2 高速缓存(“共享高速缓存”),JPA 1.0 只定义了 L1 高速缓存(“事务高速缓存”),但 JPA 提供程序可以支持共享对象高速缓存,而且大多数提供程序都支持。这就是 TopLink Essentials 的情况,它通过用于缓存的 JPA 扩展(每个 JVM)支持 L1 和 L2 缓存。
现在,正如在伟大的文章理解TopLink Essentials(GlassFish JPA)的缓存中所解释的那样:
因此,您的设置一定有其他问题。您可以尝试通过添加以下属性来禁用共享会话缓存以进行测试(并且仅用于测试目的):
<property name="toplink.cache.shared.default" value="false"/>
但如果这有什么改变,我会感到惊讶。正如我所说,我认为在某个地方还有另一个问题。
PS:这并没有回答这个问题,但是,如果您使用的是GlassFish v3,为什么不使用EclipseLink?
更新:回答OP的评论
因此,如果我保留员工记录,那么它将在数据库中看到,但在部门中的员工集合中看不到,直到我明确将其添加到员工集合中。这是必要的步骤吗?
好吧,如果你不在Java级别创建实体之间的链接,JPA将无法在数据库中创建它(JPA只做你告诉他做的事情)。所以,是的,你需要创建链接,并且在双向关联的情况下,你甚至需要设置链接的两端(例如,将 添加到员工的集合上并设置一个)。employee
Department
department
Employee