我将实体添加到我的数据库中,它工作正常。但是当我检索列表时,我得到了旧实体,我添加的新实体在我取消部署应用程序并再次重新部署之前不会显示。这意味着我的实体是否默认缓存?但是,我没有对我的 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 Extensions for Caching(每个 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
JPA 2.0 定义了共享 (L2) 缓存,但没有指定默认值。EclipseLink 默认启用缓存,其他提供程序不启用。
EntityManager 将始终具有持久性上下文 (L1) 缓存,直到您调用 clear() 或创建一个新缓存。
您可以禁用共享缓存,
见,http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching
但是你的问题是你没有维护你的关系的双方。设置 1-1 时需要添加到 1-m,否则你的对象无效。
有关缓存的更多信息,请参阅,
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching
你在使用实体管理器吗?如果不试试http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html
您是否使用 DataSource 来管理与数据库的连接?你也应该试试。是在您的服务器中配置的 xml。提供有关您的架构的更多信息,以便我们为您提供帮助。
我正在使用eclipselink和ejb的上下文,我发现当我查询实体时,它会自动被缓存,但我也运行一个函数来更改数据库中的记录,所以我可能会在缓存中获取旧数据,所以我禁用缓存通过将以下内容添加到文件中persistence.xml
:
<shared-cache-mode>NONE</shared-cache-mode>
它确实有效!