【问题标题】:JPA/Hibernate Query Returns Stale ResultsJPA/Hibernate 查询返回过时的结果
【发布时间】:2010-11-03 17:48:13
【问题描述】:

我正在使用 EXTENDED 持久上下文,因为它允许我在对象上延迟加载一对多关系,并且在我“合并”一个对象之前它也不需要 SELECT持久的上下文。

我有一个 DummyObject:

  1. “上次更新”日期字段

  2. 一对多关系

此对象通过em.merge(DummyObject) 调用在一个 JVM 中每 5 秒更新一次。

在另一个 JVM 中,我查询 DummyObject 执行如下调用

em.createQuery("from DummyObject").getResultList();  

我也每 5 秒执行一次此查询。

问题是,查询产生的对象在连续调用后都有第一个查询的时间戳,即使 Hibernate 正在生成正确的 SQL 语句(当我有语句登录时),并且数据库是正确获取更新(我已验证)。

我也尝试过使用@Version 进行各种乐观锁定,但均无济于事。 (见 cmets)

另一件事是,这在以下情况下确实可以正常工作:

  1. 我更改了 PersistentContextType 到TRANSACTIONAL( 不允许我懒加载 一对多关系)

  2. 我调用了 EntityManager.clear() 在我做上面的查询之前 (也不允许的东西 我懒洋洋地加载 ONE-MANY 关系)。

为什么我的查询返回陈旧数据?我没有启用了二级缓存或查询缓存。

我做错了吗?有什么我可以通过 query.setHint( , ) 设置的吗?

也许我没有正确理解“EXTENDED”与TRANSACTIONAL

【问题讨论】:

  • 最后更新是否映射为版本?
  • 刚刚试过。没用。我还尝试添加一个显式的“版本”字段并使用@Version 对其进行注释。也没有工作。
  • 是否等于和哈希码查看 lastUpdated?您是否看到不属于 em.createQuery() 结果的其他对象?
  • equals 和 hashcode 基于类的成员。我没有在结果中看到任何其他对象。

标签: java hibernate jpa jakarta-ee persistence


【解决方案1】:

休眠会话正在缓存持久对象。因此,因为您在一个 JVM (A) 中进行修改并在另一个 JVM(B) 中读取,所以需要刷新 B 的会话以查看更改。您可以打开一个新会话或驱逐/刷新持久对象。您还可以跨两个 JVM 复制会话,这可能会解决您的问题。或者您可以尝试更改查询以仅返回您需要的“DummyObject”片段,并且仅在需要时读取持久对象。您也可以尝试无状态会话。

【讨论】:

    【解决方案2】:

    您是否尝试过在 fetch 之前执行 flush()?

    【讨论】:

    • 你是每次都重新获取对象,还是使用延迟加载的引用?我遇到了需要在新数据出现之前再次获取对象的问题。
    • 我不确定我是否明白你的意思。我每 5 秒执行一次上述查询,我​​从该查询得到的结果是陈旧的。这更像是一个“测试”案例,而不是实际的实现。基本上我的问题是,我希望能够使用 EXTENDED 上下文类型并能够延迟加载关系。但不起作用的是查询总是返回陈旧的结果。
    • 类似:HibObj o = oDao.get(o.getId());
    【解决方案3】:

    有趣。对我来说,您的持久性上下文中的实体实例似乎没有使用查询结果进行更新。这可能是设计使然 - 您可能会通过执行查询意外地覆盖本地更改。

    更糟糕的是,JPA 中无法分离单个实例。您要么清除整个上下文,要么不清除。所以这也不是一个可能的解决方案。

    PersistanceContext 类中有一个refresh() 方法可用,该方法从数据库中获取更改并相应地更新实体实例。但我可以看到这可能不适用于实际实现。所以我的答案是:你可能无法让它工作。

    【讨论】:

    • 是的,我已经研究过遍历返回的结果集并对每个对象进行“刷新”,但是对于大型结果集,这变得很荒谬。
    • 列表的内容是否保持不变(即,您不会得到新对象,还是不会删除旧对象)?
    • 如果我不对列表中的每个对象执行 refresh(),列表的内容将保持不变。
    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2016-10-11
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多