Hibernate Grails域对象在引导中保存时触发引用对象的保存
尝试运行Grails应用程序时,我的引导文件中出现以下错误:Hibernate Grails域对象在引导中保存时触发引用对象的保存,hibernate,grails,Hibernate,Grails,尝试运行Grails应用程序时,我的引导文件中出现以下错误: org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [com.example.MyObject] with identifier [1]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateExc
org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [com.example.MyObject] with identifier [1]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.example.MyObject#1]
…这很奇怪,因为在引导中只有一个地方创建和保存对象本身。stacktrace指向我的引导中的一行,其中正在创建和保存另一个引用MyObject
的对象,我们称之为myReferenceGobject
<但是,代码>MyObject不会被修改,域对象中也没有引用它的钩子对其进行修改。还有几十个其他正在创建的对象引用相同的MyObject
,而不会引起问题
我在MyObject
中放置了一个beforeUpdate
方法,该方法打印其堆栈跟踪,以查看是什么导致它被更新。最后有两个调用,一个来自第一次创建的myreferencengobject
,另一个来自第二次创建的myreferencengobject
,这会导致陈旧对象异常
当创建
myReferenceGobject
时,为什么hibernate会触发对MyObject
的更新?为什么其他域对象没有出现这种情况?如果没有实际的(或产生错误的测试版本)域类,就很难确定问题。我建议打开sql日志,查看每次保存时生成的sql;调试会更容易。关联可能会被保存,因为和AutoRetrieveAssociations()
方法。错误的原因可能是使用hibernate不安全/无效,因此如果没有源代码,很难判断