Session.flush() 导致 org.hibernate.StaleStateException:批量更新从更新返回了意外的行数:1 实际行数:0 预期:1

Posted

技术标签:

【中文标题】Session.flush() 导致 org.hibernate.StaleStateException:批量更新从更新返回了意外的行数:1 实际行数:0 预期:1【英文标题】:Session.flush() causes org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 1 actual row count: 0 expected: 1 【发布时间】:2019-11-05 20:49:29 【问题描述】:

我有一个 java 后端 Web 应用程序,在某种数据库更新后刚刚开始抛出错误。

我已经能够将代码隔离到正在刷新 Session 变量的单行中:

Session session=getSession();

session.saveOrUpdate(parm);

session.flush();  //This is where it errors

它会抛出这个错误:

错误 AbstractFlushingEventListener 无法将数据库状态与会话同步

org.hibernate.StaleStateException:批量更新从更新返回了意外的行数:1 实际行数:0 预期:1

代码一年多没有改变;它刚刚开始抛出这个错误。

有什么建议吗?

谢谢

【问题讨论】:

请同时包含执行过程中的sql语句和完整的堆栈跟踪。 @Tim,此表的数据库端是否有更改,可能是自动生成的列正在更新,但此 saveOrUpdate 【参考方案1】:

这个错误通常是由于休眠找不到它需要更新的所有行而引起的。这意味着当您尝试更新从数据库中提取的某些对象时,它们实际上不再存在(或者从一开始就不存在)。

可能是因为另一个线程正在删除它们,或者数据库的隔离模式设置为 read_uncommited,因此由另一个事务创建的行无法保存(由于事务失败)并且不再存在。

参考:https://***.com/questions/21625059/org-hibernate-stalestateexception-batch-update-returned-unexpected-row-count-fr

【讨论】:

以上是关于Session.flush() 导致 org.hibernate.StaleStateException:批量更新从更新返回了意外的行数:1 实际行数:0 预期:1的主要内容,如果未能解决你的问题,请参考以下文章

session.flush()与session.clear()的区别

Hibernate session.flush() 使用

Hibernate session flush

session.flush与transaction.commit

NHibernate ISession Flush:何时何地使用它,为啥?

hibernate学习(六) flush()和clean()区别和使用