找出问题所在
您需要做的第一件事是找出导致问题的字段。可能是任何领域在域类中声明为List
.
就我而言,很容易找到它们,因为该项目处于非常早期的阶段,并且没有太多的领域。
然而,我发现了一个可能的解决方案 http://grails.1312388.n4.nabble.com/Fork-mode-not-including-resources-tp4658130p4658138.html以缩小可能的罪魁祸首范围。
有趣的部分是:
糟糕的是找出它们在哪里的唯一好方法是在 AbstractGrailsDomainBinder 的第 436 行设置断点并查看事务状态
解决问题
当您发现不正确的字段时,就该实施解决方法了。
假设我们的罪魁祸首是List authors
在域类中,例如:
class Book {
List<Integer> authors // keeps author ids
}
当然,我们需要删除该列表,因此解决方案如下:
class Book {
static transients = ['authors']
String authorIds
public void setAuthors(List<Integer> authorList) {
this.authorIds = authorList ? authorList.join(";") : ''
}
public List<Integer> getAuthors() {
return authorIds?.split(";")?.collect { it.toInteger() } ?: []
}
}
可能的副作用
我注意到需要调用设置器明确地上班。
我非常确定在以前的 Grails 版本中,以下代码将调用 setter:
new Book(authors: [1, 2, 3])
但看起来在 Grails 2.4.4 中需要这样做:
def book = new Book()
book.setAuthors([1, 2, 3])