【发布时间】:2010-11-03 17:48:13
【问题描述】:
我正在使用 EXTENDED 持久上下文,因为它允许我在对象上延迟加载一对多关系,并且在我“合并”一个对象之前它也不需要 SELECT持久的上下文。
我有一个 DummyObject:
“上次更新”日期字段
一对多关系
此对象通过em.merge(DummyObject) 调用在一个 JVM 中每 5 秒更新一次。
在另一个 JVM 中,我查询 DummyObject 执行如下调用
em.createQuery("from DummyObject").getResultList();
我也每 5 秒执行一次此查询。
问题是,查询产生的对象在连续调用后都有第一个查询的时间戳,即使 Hibernate 正在生成正确的 SQL 语句(当我有语句登录时),并且数据库是正确获取更新(我已验证)。
我也尝试过使用@Version 进行各种乐观锁定,但均无济于事。 (见 cmets)
另一件事是,这在以下情况下确实可以正常工作:
我更改了 PersistentContextType 到TRANSACTIONAL( 不允许我懒加载 一对多关系)
我调用了 EntityManager.clear() 在我做上面的查询之前 (也不允许的东西 我懒洋洋地加载 ONE-MANY 关系)。
为什么我的查询返回陈旧数据?我没有启用了二级缓存或查询缓存。
我做错了吗?有什么我可以通过 query.setHint( , ) 设置的吗?
也许我没有正确理解“EXTENDED”与TRANSACTIONAL。
【问题讨论】:
-
最后更新是否映射为版本?
-
刚刚试过。没用。我还尝试添加一个显式的“版本”字段并使用@Version 对其进行注释。也没有工作。
-
是否等于和哈希码查看 lastUpdated?您是否看到不属于 em.createQuery() 结果的其他对象?
-
equals 和 hashcode 基于类的成员。我没有在结果中看到任何其他对象。
标签: java hibernate jpa jakarta-ee persistence