Hibernate 这是个例外,但真的很奇怪

Hibernate 这是个例外,但真的很奇怪,hibernate,staleobjectstate,Hibernate,Staleobjectstate,我继承了一个应用程序,它执行一些基于触发器的插入和更新,偶尔抛出StaleObjectException。我试图添加大量调试(tx、hibernate、type等),这让我更加困惑 15:21:00 Calling dao.insert 15:21:00 starting Trancation T1 15:21:01 insert records including object #290595 15:21:01 Transaction T1 commits 我在日志中看到tx提交、hibe

我继承了一个应用程序,它执行一些基于触发器的插入和更新,偶尔抛出StaleObjectException。我试图添加大量调试(tx、hibernate、type等),这让我更加困惑

15:21:00 Calling dao.insert
15:21:00 starting Trancation T1 
15:21:01 insert records including object #290595
15:21:01 Transaction T1 commits
我在日志中看到tx提交、hibernate插入和数据,实际上id为#290595的对象被绑定为值。在15:24:00有一个类似的插入,但在15:25:00之前,应用程序是完全静默的(没有用户,没有其他活动)

数据库中的sql查询显示记录#290595实际上不存在。插入和故障之间有4分钟。不用说,这通常是一天中的大部分时间,但突然

hibernate不会在事务提交时自动刷新和提交吗

我假设插入已将数据移动到缓存中,但未移动到DB,在缓存中再次找到,但拒绝更新,因为它们不在DB中。所以问题是有没有人有什么好主意

这是一个oracle数据库,我已尝试确保T2需要新事务,并且隔离级别序列化,但收效甚微。。我开始觉得这些插页不知何故没有被注释


好的,我自己找到了答案

我偶然发现javadoc的原因是:

我总是假设第二个版本,从不看第一个版本。版本确实是时间戳,在阅读之后,我修改了版本属性为long,所有错误都立即消失了。不确定是否存在差异,但它对应用程序逻辑没有影响,所以

为什么会有人想使用时间戳进行版本控制呢

15:25:00 Start a Required_new transaction T2
15:25:00 Calling dao.finder
15:25:01 dao transaction uses propagated T2
15:25:01 Select returns object with id #290595
15:25:01 ends propagated transacted finder
15:25:02 calling dao.update
15:25:02 dao transaction uses propagated T2
15:25:02 binds object with id #290595
15:25:02 Could Not Synchronize Database State With Session (StaleObjectStateException)
Thrown when a version number or timestamp check failed, indicating that the Session 
contained stale data (when using long transactions with versioning). Also occurs
if we try delete or update a row that does not exist.