实体是否默认缓存在jpa中?

我将实体添加到我的数据库,它工作正常。 但是当我检索List时,我得到了旧实体,我添加的新实体在我取消部署应用程序并再次重新部署之前不会显示。 这意味着我的实体默认是缓存的吗? 但是,我没有在persistence.xml或任何此类文件中对缓存实体进行任何设置。

我甚至尝试过调用flush(),refresh()和merge()。 但它仍然只显示旧实体。 我错过了什么吗? 请帮帮我。

欢迎来到JPA。 如果您使用它,这意味着如果您在JPA之外更新数据库,除非您知道自己在做什么并且非常小心,否则将会遇到大问题。 这意味着您必须弄清楚如何刷新任何缓存的实体,以便可以重新加载它们。

基本上,如果您可以提供帮助,请不要更新JPA之外的实体,如果您这样做,您可能需要深入了解您的特定JPA提供程序使用的缓存模型的工作方式。 如果您需要在JPA之外进行更新,那么JPA可能不是您的正确选择。

这意味着我的实体默认是缓存的吗?

JPA 1.0没有定义L2缓存 (“共享缓存”),JPA 1.0只定义了一个L1缓存 (“事务缓存”),但JPA提供者可以支持共享对象缓存,大多数都支持。 这是TopLink Essentials的情况,它通过JPA Extensions for Caching (每个JVM)支持L1和L2缓存。

现在,正如在了解TopLink Essentials的缓存(GlassFish JPA)这篇伟大的文章中所解释的那样:

  • 来自相同持久性单元的所有EntityManager都共享会话缓存(这就是TopLink调用二级缓存的方式)。
  • 默认情况下会话缓存已打开。
  • 如果在持久化上下文中存在实体的修改/删除,则它们在提交事务后被同步到会话高速缓存,因此会话高速缓存的状态被更新 (或者这样的高速缓存根本不可用)。

因此,您的设置必定存在其他问题。 您可以尝试通过添加以下属性来禁用共享会话高速缓存以进行测试(并且仅用于测试目的):

 

但如果这改变了什么,我会感到惊讶。 正如我所说,我认为某处存在另一个问题。

PS:这不回答问题但是,如果您使用的是GlassFish v3,为什么不使用EclipseLink?

更新:回答OP的评论

因此,如果我坚持员工记录,那么在数据库中可以看到它,但在我明确地将其添加到员工集合中之前,它不会出现在部门中的员工集合中。 这是必要的一步吗?

好吧,如果你不在Java级别创建实体之间的链接 ,JPA将无法在数据库中创建它(JPA只执行你告诉他做的事情)。 所以, 是的 ,您需要创建链接,并且在双向关联的情况下,您甚至需要设置链接的两侧(例如,将employee添加到departmentEmployee集合并设置Employeedepartment )。

JPA 2.0定义了共享(L2)缓存,但未指定默认值。 EclipseLink默认启用缓存,其他提供程序则不支持。

在您调用clear()或创建新缓存之前,EntityManager将始终具有持久性上下文(L1)缓存。

您可以禁用共享缓存,

请参阅http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

但是你的问题是你不能保持你们关系的双方。 设置1-1时,需要添加到1米,否则对象无效。

有关缓存的更多信息,请参阅

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

你在使用EntityManager吗? 如果不试一试http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html

您是否使用DataSource来管理与数据库的连接? 你也应该尝试一下。 是在服务器中配置的xml。 提供有关架构的更多信息,以便我们为您提供帮助。

我正在使用eclipselinkejb的上下文,我发现当我查询实体时,它会自动缓存,但我也运行一个函数来更改数据库中的记录,所以我可能会在缓存中获取旧数据,所以我禁用了缓存通过将以下内容添加到文件persistence.xml

 NONE 

它确实有效!