gpt4 book ai didi

java - JPA/Hibernate 查询返回过时的结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:22 31 4
gpt4 key购买 nike

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

我有一个 DummyObject:

  1. “最后更新”日期字段

  2. 一对多关系

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

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

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

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

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

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

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

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

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

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

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

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

最佳答案

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

关于java - JPA/Hibernate 查询返回过时的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1008252/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com