大家好,我尝试添加食谱,一个食谱有很多调味品。一种调味品也可以属于许多食谱。 并且一个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]
}
}
请帮帮我
答案 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"
}
}