我正在通过Hibernate更新对象,但是尽管SQL出现在MySql日志中没有错误,但更新似乎没有发生。
我正在通过休眠执行我的请求。我已经通过 mysql 连接器代码中的这一行跟踪了代码,一切看起来都不错。
执行此行时,我的 sql 日志中会出现一个看起来正确的更新查询(它与PreparedStatement
包含的内容相同)。如果我直接从日志中复制此SQL查询并在其他连接中执行它,它将起作用并且数据已正确更新。但是,如果不手动运行它,MySql 会记录查询,但数据不会更新。
我们正在执行更新的表上没有任何触发器,也没有在其架构上。
版本:Hibernate 3.6.10, MySql Connector J 5.1.41, MySQL 5.6
旁注:
值得注意的是,Hibernate似乎认为该对象已被更新,即使在驱逐之后也是如此。我通过在 Idea 中打开一个评估控制台并执行一个findById
来测试这一点。
Hibernate返回了更新的对象,但MySql没有记录任何内容,这表明我可能必须从Hibernateevict
对象。我驱逐了对象(也通过评估弹出窗口)并执行了另一个findById
.这次,select
查询将写入 MySql 日志中,并返回更新的对象。
但是,从 sql 日志中复制select
查询并在另一个连接中直接针对数据库执行它不会返回更新的对象 - 它返回旧对象。奇怪。
该死的交易!(这是机器的错,不是我的,对吧?
我没有意识到,但我的更新正在滚动到事务中。这是在调用链上很远的方法中发生的。由于异常,该事务最终从未提交,也进一步抛出。我对交易不是很熟悉,也没有想到这是一个潜在的原因。一位同事通过退后一步并注意到 Spring 注释发现了这个问题。这也可以在MySql日志中注意到,我只是错过了它。
感谢那些查看和评论的人!