尝试保持两个实体之间的关联时遇到一个奇怪的问题。当我使用Set(即Grails的默认设置)时,它可以工作,但是,如果我尝试使用List,则子表中的关联会在域类中对其进行设置与生成的SQL插入语句之间丢失。
我从应用程序中提取了令人讨厌的代码,并设置了显示问题的最简单的测试用例-它涉及下面显示的3个域对象。
class Client {
String name
List<ModelFieldInstance> clientModelFieldInstances
static hasMany = [clientModelFieldInstances: ModelFieldInstance]
}
class ModelFieldDefinition {
String name
static hasMany = [ modelFieldInstances: ModelFieldInstance ]
def afterInsert() {
Client.findAll().each { client ->
ModelFieldInstance.withNewSession {
ModelFieldInstance modelFieldInstance = new ModelFieldInstance(['modelFieldDefinition.id': this.id, 'client.id': client.id])
modelFieldInstance.save()
}
}
}
}
class ModelFieldInstance {
String value
static belongsTo = [ modelFieldDefinition: ModelFieldDefinition, client: Client ]
}
在Bootstrap.groovy中,我正在创建一个Client和一个ModelFieldDefinition-
Client client = new Client(name: 'Some Client')
client.save(flush: true)
ModelFieldDefinition contactName = new ModelFieldDefinition([name: 'Contact Name'])
contactName.save(flush: true)
ModelFieldDefinition中的afterInsert方法用于为每个客户端创建空的ModelFieldInstances。如果我使用STS调试器逐步执行afterInsert代码,则可以看到modelFieldInstance.client具有正确的值,但是一旦
modelFieldInstance.save()被调用,我将收到一条异常,指出modelFieldInstance.client为null-
Caused by MySQLIntegrityConstraintViolationException: Column 'client_id' cannot be null
如果我更改了
Client类,则像这样删除
List声明-
class Client {
String name
static hasMany = [clientModelFieldInstances: ModelFieldInstance]
}
然后,关联将正确持久。为什么
List不起作用?
编辑-我正在使用Grails 2.2.0
请您参考如下方法:
看看GORM docs。如果您使用List而不是Set,则Hibernate将在数据库中创建clientModelFieldInstances_idx列。必须填充此列以确保List中对象的顺序。
从文档:使用列表时,必须先将元素添加到集合中,然后再保存,否则Hibernate会抛出异常。
尝试使用addTo*方法,而不是手动设置相应的ID。




