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

Grails:addTo()方法对新创建的对象不起作用吗?,grails,gorm,Grails,Gorm,我使用的是Grails2.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) A 如果(是新

我使用的是Grails2.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) 
A
如果(是新的){
a=新的a()
}否则{
a=a.findById(someId)
} 
List bList=getBsFromSomeOtherMethod()
bList.each{a.addToBs(it)}
a、 保存(failOnError:true)
有趣的是,如果我创建了一个新对象(如中所示,在上述逻辑中isNew为true),那么在调用save()时会出现以下异常:
重新关联的对象具有脏集合引用(或数组)

然而,如果我得到一个已经存在于数据库中的对象,那么一切都会完美地工作

我发现的解决方法是,如果我在将B添加到A之前保存新对象,那么一切都会正常工作。但是我不希望调用save()两次,如果调用刚刚结束,代码就会干净得多

我用谷歌搜索了例外情况,但似乎没有什么能解释这里发生了什么。

有人能帮上忙吗?

就像其他人在评论中说的那样,你需要保存对象,使其存在于数据库中,并且有一个id。当你有一个
a有许多Bs
关系时,会在数据库中创建一个新表(类似
a\u b
)以将
a.id
映射到
b.id
,这就是为什么不先保存,就不能将
B
s添加到
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)
A
如果(是新的){
a=新的a()
a、 保存()
}否则{
a=a.findById(someId)
} 
List bList=getBsFromSomeOtherMethod()
bList.each{a.addToBs(it)}
a、 保存(failOnError:true)

正如其他人在评论中所说,您需要保存对象,使其存在于数据库中,并具有id。当您具有
a具有多个Bs
关系时,将在数据库中创建一个新表(类似
a_b
)以将
a.id
映射到
b.id
,这就是为什么不先保存,就不能将
B
s添加到
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)
A
如果(是新的){
a=新的a()
a、 保存()
}否则{
a=a.findById(someId)
} 
List bList=getBsFromSomeOtherMethod()
bList.each{a.addToBs(it)}
a、 保存(failOnError:true)
用于此类操作。您将从db中获得适当的对象,或保留新对象:

def a = A.findOrSaveByField(field)
List<B> bList = getBsFromSomeOtherMethod() 
bList.each { a.addToBs(it) }
a.save(failOnError: true)
def a=a.findOrSaveByField(字段)
List bList=getBsFromSomeOtherMethod()
bList.each{a.addToBs(it)}
a、 保存(failOnError:true)
用于此类操作。您将从db中获得适当的对象,或保留新对象:

def a = A.findOrSaveByField(field)
List<B> bList = getBsFromSomeOtherMethod() 
bList.each { a.addToBs(it) }
a.save(failOnError: true)
def a=a.findOrSaveByField(字段)
List bList=getBsFromSomeOtherMethod()
bList.each{a.addToBs(it)}
a、 保存(failOnError:true)

问题是
A
需要有一个与之相关联的ID,用于向其添加
B
s的查询。如果您先创建一个新的
.save()
以使其正常工作,则无法避免在
A
上调用
.save()。在添加任何
B
s之前,只需添加
if(isNew)a.save()
。一行代码并不会使它变得更干净。在将创建的对象关联到b对象列表之前,您需要保存它。问题是,
a
需要有一个与之关联的ID,用于向其添加
b
s的查询。如果您先创建一个新的
.save()
以使其正常工作,则无法避免在
A
上调用
.save()。在添加任何
B
s之前,只需添加
if(isNew)a.save()
。一行代码并不会让它变得更干净。在将创建的对象关联到b对象列表之前,您需要保存它