2010-04-25 95 views
16

我添加实体到我的数据库,它工作正常。但是,当我检索列表,我得到旧的实体,我添加的新实体不显示,直到我取消部署应用程序并重新部署它。这意味着我的实体默认缓存?但是,我没有为我的persistence.xml或任何这样的文件中的缓存实体进行任何设置。实体默认缓存在jpa中吗?

我甚至试图调用flush(),刷新()和合并()。但它仍然只显示旧实体。我错过了什么吗?请帮帮我。

回答

16

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

基本上不更新JPA以外的实体,如果你能在所有帮助它,如果你这样做,你可能要进入你的特定JPA提供商使用的缓存模式的运作。如果您需要更新JPA之外的许多内容,那么JPA可能不是您的正确选择。

+1

但我不更新JPA以外的数据库。我用jpa的持久化方法,并在数据库中看到记录。但是当我检索列表时,我没有看到新添加的实体。请帮帮我。 – TCM 2010-04-25 10:53:50

+0

此外,更奇怪的是,如果我将提供程序从TopLink更改为EclipseLink,则一切正常!有了TopLink,只有这个问题即将到来。我正在使用Netbeans 6.8和Glassfish v3。 – TCM 2010-04-25 10:59:58

+0

@Nitesh你在使用交易吗?如果是的话,你承诺他们? – cletus 2010-04-25 11:43:26

11

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

JPA 1.0没有定义L2高速缓存(“共享高速缓存”),JPA 1.0只定义一个L1高速缓存(“事务缓存”),但JPA提供商可以支持一个共享对象的高速缓存,且最做。 TopLink Essentials通过JPA Extensions for Caching(每个JVM)支持L1和L2缓存。现在

,作为伟大的文章Understanding the cache of TopLink Essentials(GlassFish JPA)中解释说:

  • 所有来自同一个持久单元股份EntityManagers会话缓存(这是TopLink的是如何调用2级缓存)。
  • 会话缓存默认情况下开启。
  • 如果在持久性上下文中存在实体的修改/删除,它们会在事务提交后同步到会话高速缓存,因此会话高速缓存的状态将更新为(或者根本没有可用的高速缓存) 。

所以一定有别的东西不对您的设置。你可以尝试通过添加以下属性禁用测试目的(且仅用于测试目的)共享会话缓存:

<property name="toplink.cache.shared.default" value="false"/> 

不过,我会感到惊讶,如果这个改变任何东西。正如我所说,我认为在某个地方还有另一个问题。

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

更新:回答OP

所以,如果我坚持员工的记录,那么它被认为是在数据库中的注释,但没有在部门的员工集合,直到我明确地将它添加到员工的集合。这是必要的步骤吗?

好吧,如果你不建立在Java级别实体之间的联系,JPA将无法在数据库中创建它(JPA不仅是你告诉他这样做)。因此,,您需要创建链接,并且在双向关联的情况下,甚至需要设置链接的两侧(例如将employee添加到Department的员工集合并将department设置为一个Employee)。

+3

嗨Pascal Thivent,我的提供者EclipseLink在我的persistence.xml中,一切正常。但是我还有另一个疑问,那就是我要求cletus也是这样的: - 基本上,发生什么事情是说员工和部门表。部门表中有员工收集。因此,如果我坚持员工记录,那么它会在数据库中看到,但不会收集到部门中的员工,除非我明确将其添加到员工集合中。这是必要的步骤吗?如果我有10个表与一个实体有关。我是否必须将其添加到所有10个表的集合中?那太乏味了? – TCM 2010-04-26 02:50:41

1

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

EntityManager将始终有一个持久化上下文(L1)缓存,直到您调用clear()或创建一个新缓存。

您可以禁用共享缓存,

见,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

0

我使用的EclipseLinkEJB的背景下,我发现,当我查询实体,它会自动被缓存,但我还运行功能改变数据库记录,所以我可以在高速缓存中获取旧数据,所以我通过添加禁用缓存下面的文件persistence.xml

<shared-cache-mode>NONE</shared-cache-mode> 

它的工作!