尝试保持两个实体之间的关联时遇到一个奇怪的问题。当我使用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。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!