我正在使用Grails 2.4.4和MySQL数据库。我们正在尝试克隆具有父子关系的数据库中的一组表。例如,我们有一个表作者及其子表书和书,其中外键fk_book指向作者。
我们通过Author.get(id)
,克隆作者及其相关书籍检索层次结构,并使用clonedAuthor.save(flush:true)
进行保存。我们有这样的几个表的层次结构,一些具有OneToOne,一些具有OneToMany关系。在数据库中,外键约束为ON DELETE NO ACTION。
问题是在调用时。它正在抛出乐观锁定失败例外
Row was updated or deleted by another transaction.
我没有得到哪个事务正在更新行,因为我们只有一个事务(只有一个事务)。
答案 0 :(得分:2)
当使用mysql控制台修改db数据时,我遇到了同样的问题,而某些数据已经被提取到hibernate会话。
为什么会发生这种情况?
很简单,db和hibernate会话中的数据不同步。
此外,如果您在会话中放置域对象(或任何相关域对象),请在调用obj.attach()
之前重新附加对象(save
),delete
.. < / p>
答案 1 :(得分:0)
您有3种解决方案:在save()之前执行merge()或attach()...或映射版本为false的实体。