Grails多对多关注

时间:2015-07-30 15:34:33

标签: grails

大家好,我尝试添加食谱,一个食谱有很多调味品。一种调味品也可以属于许多食谱。 并且一个condimant可以有一些额外的值,如金额和金额的实体。

我的Bootstrap.groovy中出现以下错误(使用GGTS,Grails 2.4.4,mysql)

错误:

Message: No signature of method: marvelonlinerezepte.Zutat.addToRezept() is applicable for argument types: (marvelonlinerezepte.Rezept) values: [Bratwurst mit Sauerkraut]
Possible solutions: addToRezepte(java.lang.Object)
    Line | Method
->>   32 | doCall                           in BootStrap$_closure1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    327 | evaluateEnvironmentSpecificBlock in grails.util.Environment
|    320 | executeForEnvironment . . . . .  in     ''
|    296 | executeForCurrentEnvironment     in     ''
|    262 | run . . . . . . . . . . . . . .  in java.util.concurrent.FutureTask
|   1145 | runWorker                        in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . . . . . . . . . . . .  in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run                              in java.lang.Thread
Error |
Forked Grails VM exited with error

引导程序:

import org.junit.internal.runners.statements.FailOnTimeout;

import marvelonlinerezepte.Zutat
import marvelonlinerezepte.Rezept
import marvelonlinerezepte.MmRezepteZutaten

class BootStrap {

    def init = { servletContext ->
        Zutat sauerkraut = new Zutat()
        Zutat bratwurst = new Zutat()
        Zutat rapsoel = new Zutat()

        sauerkraut.bezeichnung = 'Sauerkraut'
        bratwurst.bezeichnung = 'Bratwurst'
        rapsoel.bezeichnung = 'Rapsöl nativ'

        sauerkraut.save()
        bratwurst.save()
        rapsoel.save()

        Rezept bratwurstMitSauerkraut = new Rezept()

        bratwurstMitSauerkraut.name = 'Bratwurst mit Sauerkraut'
        bratwurstMitSauerkraut.zubereitung = 'Bratwurst in Öl anbraten bis Sie schön braun sind. Sauerkraut in einem Topf langsam erwärmen. Servieren und FERTIG :)'
        bratwurstMitSauerkraut.zubereitungszeitInMinuten = 15
        bratwurstMitSauerkraut.kcalProPerson = 350.55F  

        bratwurstMitSauerkraut.save(failOnError:true,flush:true)

        /*here comes the error*/
        sauerkraut.addToRezept(bratwurstMitSauerkraut)
        bratwurst.addToRezept(bratwurstMitSauerkraut)

        bratwurstMitSauerkraut.save(flush:true)


    }

    def destroy = {
    }
}

我的域名类:

 package marvelonlinerezepte

class Rezept {

    String name
    String zubereitung
    Integer zubereitungszeitInMinuten
    Float kcalProPerson

    static hasMany = [zutaten:Zutat]

    static constraints = {
        name(nullable:false, blank:false)
        zubereitung(nullable:true, blank:true, size:50..10000)
        kcalProPerson(nullable:true,blank:true,setScale:2)
        zubereitungszeitInMinuten(nullable:true,blank:true)

    }

    static mapping = {
        zubereitung type: 'text'
        zutaten joinTable: [name: "mm_rezepte_zutaten", key: 'rezept_id']
     }

    String toString(){
        return this.name;
    }
}


    package marvelonlinerezepte

class Zutat {

    String bezeichnung

    static belongsTo = Rezept

    static hasMany = [rezepte:Rezept]

    static constraints = {
        bezeichnung(nullable:false, blank:false)

    }
    static mapping = {  
        rezepte joinTable: [name: "mm_rezepte_zutaten", key: 'zutat_id']
    }

    String toString(){
        return this.bezeichnung;
    }

}


    package marvelonlinerezepte

import org.apache.commons.lang.builder.HashCodeBuilder

class MmRezepteZutaten implements Serializable {

    Rezept rezept
    Zutat zutat

    Float menge = 1
    String einheit = "g"

    static constraints = {
        menge min:0.01F
        einheit inList: ["g", "l","ml", "EL", "TL","stck","prise"]
    }

    static mapping = {
        table 'mm_rezepte_zutaten'
        version false
        id composite: ["rezept","zutat"]
    }

    boolean equals(other) {
        if (!(other instanceof MmRezepteZutaten)) {
            return false
        }

        other.rezept?.id == rezept?.id &&
        other.zutat?.id == zutat?.id
    }

    int hashCode() {
        def builder = new HashCodeBuilder()
        if (rezept) builder.append(rezept.id)
        if (zutat) builder.append(zutat.id)
        builder.toHashCode()
    }

    static MmRezepteZutaten get(long rezeptId, long zutatId) {
        find 'from mm_rezepte_zutaten where rezept.id=:rezeptId and zutat.id=:zutatId',
            [rezeptId: rezeptId, zutatId: zutatId]
    }

    static MmRezepteZutaten create(Rezept rezept, Zutat zutat, boolean flush = false) {
        new MmRezepteZutaten(rezept: rezept, zutat: zutat).save(flush: flush, insert: true)
    }

    static boolean remove(Rezept rezept, Zutat zutat, boolean flush = false) {
        MmRezepteZutaten instance = MmRezepteZutaten.findByRezeptAndZutat(rezept, zutat)
        instance ? instance.delete(flush: flush) : false
    }

    static void removeAll(Rezept rezept) {
        executeUpdate 'DELETE FROM mm_rezepte_zutaten WHERE rezept=:rezept', [rezept: rezept]
    }

    static void removeAll(Zutat zutat) {
        executeUpdate 'DELETE FROM mm_rezepte_zutaten WHERE zutat=:zutat', [zutat: zutat]
    }


}

请帮帮我

3 个答案:

答案 0 :(得分:0)

我会让关系变得更简单。这可能是问题所在。您实际上不需要拥有belongsTo。而且我很确定添加它意味着一种调味品只属于一种食谱。

尝试以下方法:

class Zutat {

    String bezeichnung

}

class Rezept {

    String name
    String zubereitung
    Integer zubereitungszeitInMinuten
    Float kcalProPerson

    static hasMany = [zutaten:Zutat]
}

如果有帮助,请告诉我。

答案 1 :(得分:0)

这是因为你宣布它是错误的方式:

以下是几页并指导: https://github.com/vahidhedayati/testads5/blob/master/grails-app/domain/ajaxdependancyselectexample/MyBorough.groovy https://github.com/vahidhedayati/testads5/blob/master/grails-app/domain/ajaxdependancyselectexample/MyCity.groovy

https://github.com/vahidhedayati/testads5/blob/master/grails-app/conf/BootStrap.groovy#L112-L130

Rezept bratwurstMitSauerkraut = new Rezept()
bratwurstMitSauerkraut.name = 'Bratwurst mit Sauerkraut'
bratwurstMitSauerkraut.zubereitung = 'Bratwurst in Öl anbraten bis Sie schön braun sind. Sauerkraut in einem Topf langsam erwärmen. Servieren und FERTIG :)'
bratwurstMitSauerkraut.zubereitungszeitInMinuten = 15
bratwurstMitSauerkraut.kcalProPerson = 350.55F  
bratwurstMitSauerkraut.save()

Zutat sauerkraut = new Zutat(bezeichnung : 'Sauerkraut')
sauerkraut.addToRezepte(bratwurstMitSauerkraut)
sauerkraut.save(flush:true)

尝试类似上面的内容,尚未经过测试,但有点类似于我在链接中显示的示例。还要注意Rezepte它给你的实际别名,但从大写开始,它看起来就像一个未知的字段。

答案 2 :(得分:0)

大家好多谢谢答案。 我可以自己修复问题,这里的代码对我来说非常有用:

在bootstrap中我改变了这个:

bratwurstMitSauerkraut.addToZutaten(bratwurst)
bratwurstMitSauerkraut.addToZutaten(sauerkraut)                 
bratwurstMitSauerkraut.save(flush:true)

然后他抱怨一个mysql错误,关于MmRezepteZutaten中没有所有额外属性的默认值。这可以修改如下:

package marvelonlinerezepte

import org.apache.commons.lang.builder.HashCodeBuilder

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.DefaultValueLoaderDecorator;

class MmRezepteZutaten implements Serializable {

    Rezept rezept
    Zutat zutat

    Float menge = 1.0f
    String einheit = "g"

    Float preis = 0.0f

    String laden
    Integer reihenfolge

    static constraints = {
        menge min:0.01F
        einheit inList: ["g", "l","ml", "EL", "TL","stck","prise"]
        laden inList: ["Aldi","Edeka"]
    }

    static mapping = {
        table 'mm_rezepte_zutaten'
        version false
        id composite: ["rezept","zutat"]

        menge defaultValue: "1.0"
        einheit defaultValue: "'g'"
        preis defaultValue: "0.0"
        laden defaultValue: "'Aldi'"
        reihenfolge defaultValue: "0"
    }


}