[英]Grails many-to-many concern
大家好,我嘗試添加食譜,一個食譜有很多調味品。 調味品也可以屬於許多食譜。 並且條件可以具有一些其他值,例如數量和數量的實體。
我在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]
}
}
請幫幫我
我會簡化關系。 這可能是問題所在。 您實際上並不需要擁有belongsTo。 我很確定,添加它將意味着一種調味品僅屬於一種配方。
請嘗試以下操作:
class Zutat {
String bezeichnung
}
class Rezept {
String name
String zubereitung
Integer zubereitungszeitInMinuten
Float kcalProPerson
static hasMany = [zutaten:Zutat]
}
讓我知道是否有幫助。
這是因為您在聲明錯誤的方法:
以下是幾頁內容和指南: 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為其提供了實際的別名,但從大寫字母開始,它將看起來像一個未知字段。
大家好,非常感謝您的回答。 我可以自己解決問題,這是對我真正有效的代碼:
在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"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.