2014-11-13 37 views
0

我在Grails 2.4中创建了两个对象之间的多对多关系,但是当我尝试在自举文件中添加数据时,它失败并且给我这个错误Grails:以多对多关系添加数据会产生错误

Message: No signature of method: ca.ogsl.romm.observation.Behavior.addToTaxonGroup() is applicable for argument types: (ca.ogsl.romm.observation.TaxonGroup) values: [ca.ogsl.romm.observation.TaxonGroup : (unsaved)] 
Possible solutions: addToTaxonGroups(java.lang.Object) 

这些都是我的领域类

Behavior.groovy

class Behavior { 
    int id 
    String code 
    String nameFr 
    String nameEn 

    static belongsTo = TaxonGroup 
    static hasMany = [taxonGroups: TaxonGroup] 

    static constraints = { 
     nameFr nullable: true 
     nameEn nullable: true 
    } 
} 

TaxonGrou p.groovy

class TaxonGroup { 
    int id 
    String code 
    String nameFr 
    String nameEn 

    static hasMany = [behaviors: Behavior] 

    static constraints = { 
     nameFr nullable: true 
     nameEn nullable: true 
     behaviors nullable: true 
    } 
} 

Finaly,这是我BootStrap.groovy中的代码

new Behavior(code: "basking") 
      .addToTaxonGroup(new TaxonGroup(code:"reptiles")) 
      .save() 

我一直在寻找了几个小时尝试了很多方式加入,但似乎没有解决这个问题...

任何人作为我做错什么的想法? 非常感谢您的时间!

回答

1

addToXXX和removeFromXXX动态方法是使用hasMany映射中的键创建的;这也是Grails为您添加项目的SetList的名称。前缀addTo(或removeFrom)并大写第一个字母 - 因此对于taxonGroups这将是addToTaxonGroups,而不是addToTaxonGroup。同样对于behaviors,它将是addToBehaviorsremoveFromBehaviors

此外,无关(而不是问题) - 删除behaviors nullable: true;这没有任何作用。集合(除了首次实例化类实例时)不是空的,就是有一个或多个项目,但在持久性实例中永远不会为空。

并删除int id - Grails在编译期间通过AST为字节码添加Long id属性,并且几乎没有任何好处,因为几乎每个编辑器/ IDE /等都有冗余指定属性。预计将有一个id字段,所以它不会帮助自动完成等

+0

嗯,你没事我认为我应该做的班级的链接,但是如果你有同一对象上有多个关系。使用大写的属性名称解决了我的问题。感谢您的帮助和其他建议! – rattek