我正在使用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(),并且如果调用只是在结尾处,那么代码将更加简洁。
我已经用谷歌搜索了异常,但是似乎没有什么可以解释这里发生的事情。
有人可以帮忙吗?
答案 0 :(得分:2)
就像其他人在评论中说的那样,您需要保存对象,使其在数据库中存在并具有ID。当您具有A has many Bs
关系时,将在数据库中创建一个新表(类似a_b
)以将A.id
映射到B.id
,这就是为什么您不能添加从B
到A
,而不先保存。
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