【问题标题】:Refreshing collection (getResultList) of entities by entityManager.refresh通过 entityManager.refresh 刷新实体集合(getResultList)
【发布时间】:2010-07-08 14:24:27
【问题描述】:

启用 JPA 缓存时如何刷新实体的 getResultList 集合。 我的意思是:

列出客户 = query.getResultList();

????? > em.refresh(客户)! // 我需要刷新,因为缓存已启用。

RGDS 纳维德

【问题讨论】:

  • 您能否提及您正在使用的提供程序以及如何启用缓存(我想这是一个 JPA 2.0 问题,但提供上下文信息通常会有所帮助)?实际上,您能否澄清整个问题并适当地格式化(我什至不明白您要展示什么)?您要解决的问题是什么?为什么你需要“刷新”一些东西?
  • 我用的是eclipselink,glassfish v3,JPA 2.0(我想,如何保证JPA的版本)
  • 我有两个实体,比如客户和订单,每个客户都有很多订单,所以我在它们之间创建了@OneToMany 和@ManyToOne 关系,所以当我通过 em.find() 找到客户实体时订单不会刷新并来自缓存,但我调用 em.refresh(customer) 但似乎此命令不会刷新客户的订单。

标签: java jpa


【解决方案1】:

在 JPA 2.0 中,通过使用查询提示完全跳过 L2 缓存可能更容易。例如:

Query query = em.createQuery(...); 
query.setHint("javax.persistence.cache.retrieveMode", "BYPASS"); // skip the L2 cache.
List customers = query.getResultList();

这在 JPA 1.0 中不可用。如果您使用的是 JPA 1.0,则可能必须使用供应商特定的 API。我相信 Hibernate 提供了类似于 JPA 2.0 提示的东西(其他提供者可能也有这种机制)。 OpenJPA 有一个 refreshAll(Collection c) 方法也应该适用于您,我怀疑其他提供商也有类似的东西。 EclipseLink 似乎没有。

【讨论】:

  • 不工作! -> setHint("javax.persistence.cache.retrieveMode", "BYPASS");我正在使用具有所有默认设置和编码的 JPA2 eclipselink 和 glassfish v3
  • 如果我调用 em.getEntityManagerFactory().getCache().evictAll();在查询之前它有效但我不想清除此查询的所有 L2 缓存。如何使您的答案正常工作?
  • eclipselink 没有 refreshAll !!
  • 抱歉并不是暗示所有 JPA 提供商都有 refreshAll - 只是您的供应商可能有类似的东西。我将进行编辑以使其更清晰。
  • 由于您使用的是 EclipseLink,您可以尝试他们的提示,而不是规范中的属性。这里有几个例子:wiki.eclipse.org/EclipseLink/Development/JPA_2.0/…eclipse.org/eclipselink/api/2.0/org/eclipse/persistence/config/…
【解决方案2】:

在调用 em.refresh() 之前,你应该使用 em.getEntityManagerFactory().getCache().evictAll(); 清除缓存

这是 JPA2 中的一个新特性,因此您可能必须更新您的 ORM 框架。

【讨论】:

  • 如果我清除缓存就不需要调用刷新,不是吗?
  • 我的问题是如何刷新实体集合
  • 刷新会覆盖最近从 db 到对象的更改,因此您必须为每个实体对象调用它
  • 如果在调用 getResultList() 之前清除缓存,则不需要使用 em.refresh()
  • 感谢,em.getEntityManagerFactory().getCache().evictAll();为我工作。
猜你喜欢
  • 2012-08-30
  • 2017-03-11
  • 2012-04-17
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2014-11-28
相关资源
最近更新 更多