grails - 引起多对多关注

标签 grails

大家好,我尝试添加食谱,一个食谱有很多调味品。调味品也可以属于许多食谱。
并且条件可以具有一些其他值,例如数量和数量的实体。

我在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

bootstrap :
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]
    }


}

请帮帮我

最佳答案

我会简化关系。这可能是问题所在。您实际上并不需要拥有belongsTo。而且我很确定添加它会意味着一种调味品仅属于一种配方。

请尝试以下操作:

class Zutat {

    String bezeichnung

}

class Rezept {

    String name
    String zubereitung
    Integer zubereitungszeitInMinuten
    Float kcalProPerson

    static hasMany = [zutaten:Zutat]
}

让我知道是否有帮助。

关于grails - 引起多对多关注,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31728103/

相关文章:

sql - 如何同时按最大日期和组获取 grails 中的记录

grails - 在 Grails 中指定插件的顺序

html - 在grails中显示blob文本

jquery - 后退按钮可移动数据表的第n页

java - 检索 Grails 域验证消息

shell - GVM/Grails shell 脚本错误?

grails - 即使使用显式刷新,也无法让 GORM mongodb 插件保存新记录

grails - Grails 2 rc3 中的安全操作

grails - GORM按属性获取域对象列表

grails - 一次添加多个属于父级的 child