【问题标题】:JPA2(JBoss7.1's Hibernate) entityManager.find() is getting data from Cache not from DBJPA2(JBoss7.1's Hibernate) entityManager.find() 正在从缓存而不是从数据库中获取数据
【发布时间】:2012-05-02 04:18:12
【问题描述】:

我正在通过 JBoss7.1 使用 JSF2、JPA2、EJB3 开发一个 Web 应用程序。 我有一个实体(论坛),其中包含子实体(主题)的列表。 当我第一次尝试通过 forumId 获取主题列表时,数据正在从数据库中加载。

List<Topic> topics = entityManager.find(Forum.class, 1).getTopics();

之后,我向论坛添加了更多子实体(主题),然后我再次尝试按 forumId 检索主题列表。坚果我只得到旧的缓存结果。新插入的子记录未从 DB 加载。

我可以使用以下方法加载子实体(主题):

方法一:在entityManager.find()之前调用entityManager.clear()

方法2:使用

em.createQuery("select t from Topic t where t.forum.forumId=?1", Topic.class); 

em.createQuery("SELECT t FROM Topic t JOIN t.forum f WHERE f.forumId = ?1", Topic.class);

我知道在 NamedQueries 上设置 QueryHints。但是 em.find() 方法在一个超级 CrudService 中,所有 DAO(无状态 EJB)都在扩展它。所以设置 QueryHints 对我不起作用。

所以我想知道如何使用 em.find() 方法从数据库而不是缓存中加载数据?

PS:我使用的是 Extended Persistence Context 类型。

@PersistenceContext(unitName="forum", type=PersistenceContextType.EXTENDED)
protected EntityManager em;

【问题讨论】:

  • 你有没有二级缓存?向我们展示论坛和主题实体的代码,以及用于向论坛添加新主题的代码。

标签: java hibernate jboss jpa-2.0


【解决方案1】:

您可以通过设置控制实体管理器与二级缓存交互的附加属性来指定单个 find 操作的行为。

Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);
entityMgr.find(Forum.class, 1, props).getTopics();

【讨论】:

  • 我不知道 BYPASS,+1
  • props.put("javax.persistence.cache.retrieveMode", "BYPASS");不管用。获取相同的旧缓存对象。
  • 根据您的提供商,您可能需要使用 JPA 2.0 枚举。请参阅对我的答案的编辑。
  • 我认为CacheRetrieveMode适用于二级缓存,而本例中的陈旧日期来自实体管理器内的一级缓存。
  • @sivaprasadreddy.k - 您提到 find 方法在您的 DAO 扩展的更高级别的服务中被调用。你在那里换了电话吗?
【解决方案2】:

ForumTopic 之间的关系是否可能只添加到您的实体 bean 中的一个方向?如果您在主题上设置了论坛 id,您还应该将此主题添加到 Forum 对象中,以使一级缓存中的数据保持一致。您还应该确保您没有使用两个不同的实体管理器进行更新和查找。第一级缓存仅保留每个实体管理器,另一个 em 仍然可以包含旧版本的实体。

可能不相关,但使用 JPA2,您还有一个最小的 api,用于从二级缓存中驱逐实体,可以在更新后使用:

em.getEntityManagerFactory().getCache().evict(Forum.class, forumId);

【讨论】:

    【解决方案3】:

    将@Cacheable(false) 放在 Forum.class 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多