Grails:addTo()方法不适用于新创建的对象吗?

时间:2018-08-21 17:40:29

标签: grails gorm

我正在使用Grails 2.5.5,这里有一个简单的场景:A有很多B。

因此,我有一个事务性服务方法,该方法主要执行以下操作:

A a 
if (isNew) {
    a = new A()
} else {
    a = A.findById(someId)
} 

List<B> bList = getBsFromSomeOtherMethod() 
bList.each { a.addToBs(it) } 

a.save(failOnError: true) 

有趣的是,如果创建一个新对象(如上述逻辑中的isNew为true),则在调用save()时会出现以下异常:reassociated object has dirty collection reference (or an array)

但是,如果我得到一个已经存在于数据库中的对象,那么一切都将完美运行。

我发现的解决方法是,如果我在将B添加到A之前保存了新对象,则一切正常。但是我宁愿不必两次调用save(),并且如果调用只是在结尾处,那么代码将更加简洁。

我已经用谷歌搜索了异常,但是似乎没有什么可以解释这里发生的事情。
有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

就像其他人在评论中说的那样,您需要保存对象,使其在数据库中存在并具有ID。当您具有A has many Bs关系时,将在数据库中创建一个新表(类似a_b)以将A.id映射到B.id,这就是为什么您不能添加从BA,而不先保存。

A a 
if (isNew) {
    a = new A()
    a.save()
} else {
    a = A.findById(someId)
} 

List<B> bList = getBsFromSomeOtherMethod() 
bList.each { a.addToBs(it) } 

a.save(failOnError: true)

答案 1 :(得分:2)

使用findOrSaveBy进行此类操作。您将从db中获得适当的对象,或保留新的对象:

Audio {props: undefined, context: undefined, refs: {…}, updater: {…}, recordAudio: ƒ, …}
    context:undefined
    props:undefined
    recordAudio:ƒ ()
    refs:{}
    state:{showButton: true}
    stopRecording:ƒ ()
    updater:{isMounted: ƒ, enqueueForceUpdate: ƒ, enqueueReplaceState: ƒ, enqueueSetState: ƒ}
    isMounted:(...)
    replaceState:(...)
    __proto__:ReactComponent