gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:18:42 24 4
gpt4 key购买 nike

我正在使用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(),并且如果调用只是在结尾处,那么代码将更加简洁。

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

最佳答案

就像其他人在评论中说的那样,您需要保存对象,使其在数据库中存在并具有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)

关于grails - Grails:addTo()方法不适用于新创建的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51954035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com