【问题标题】:Many-To-Many optimistic locking failed多对多乐观锁定失败
【发布时间】:2015-11-17 15:25:47
【问题描述】:

我有 2 个处于多对多关系的 DomainClass:

class Foo {
   static hasMany=[bars:Bar]
}
Class Bar {
   static belongsTo = [Foo]
   static hasMany=[foos:Foo]
} 

现在我想像这样向 Foo 添加一个 Bar:

Foo foo = Foo.get(params.fooId)
Bar bar = Bar.get(params.barId)
if(!foo || !bar)
   return render(template:'error')
foo.addToBars(bar)
foo.save(flush:true, failOnError:true)
return render(template:'success')

这导致HibernateOptimisticLockingFailureException

org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: 带有标识符 [1] 的类 [test.Foo] 的对象:乐观锁定失败;嵌套异常是 org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存值映射不正确):[test.Foo#1]

为什么会出现这个错误?

【问题讨论】:

  • 在 Bar 类中应该是“static belongsTo = Foo”(无括号)吗?
  • 我试过了,但没有帮助。

标签: grails grails-orm


【解决方案1】:

尝试根据以下代码映射域映射部分中的junction table

class Foo {
   static hasMany = [bars:Bar]

   // etc

   static mapping = {
        // etc
        bars joinTable:[name: 'foo_bar', key: 'foo_id']     
    }
}

另一个域也是如此

class Bar {
   static belongsTo = Foo
   static hasMany = [foos:Foo]

   // etc

   static mapping = {
        // etc
        foos joinTable:[name: 'foo_bar', key: 'bar_id']     
    }
} 

最后,使用foo.addToBars(bar) 并保存它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多