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

TCM*_*TCM 17 java jpa second-level-cache toplink-essentials

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

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

cle*_*tus 19

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

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

  • 我没有使用任何使用entitymanager.getTransaaction或任何容器管理事务的事务.我可以在数据库中看到记录,但不能在我检索的列表中看到.基本上,会发生的事情是有员工和部门表.部门表有员工集合.因此,如果我坚持员工记录,那么在数据库中可以看到它,但在我明确地将其添加到员工集合中之前,它不会出现在部门中的员工集合中.这是必要的一步吗?如果我有10个表与一个实体有关.我是否必须将其添加到所有10个表的集合中?那太繁琐了? (2认同)
  • @Nitesh 这是另一种方式:您更新对象并更新数据库以反映这一点。您必须考虑是否希望您的一对多关系也是单向的或双向的。仅仅因为您可以在一侧拥有一组实体并不意味着您应该这样做。 (2认同)

Pas*_*ent 12

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

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

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

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

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

<property name="toplink.cache.shared.default" value="false"/>
Run Code Online (Sandbox Code Playgroud)

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

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

更新:回答OP的评论

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

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

  • 嗨Pascal Thivent,我在persistence.xml中提供给EclipseLink,一切正常.但我仍然有另一个疑问,我还要求克莱特斯: - 基本上,会发生什么,比如有员工和部门表.部门表有员工集合.因此,如果我坚持员工记录,那么在数据库中可以看到它,但在我明确地将其添加到员工集合中之前,它不会出现在部门中的员工集合中.这是必要的一步吗?如果我有10个表与一个实体有关.我是否必须将其添加到所有10个表的集合中?那太繁琐了? (3认同)