Mehrere hasMany Beziehungen zu denselben domain-Klasse in Grails
Bin ich mit Grails, und ich habe ein domänenmodell mit mehreren hasMany Attribute die gleiche Domäne-Klasse, die wie folgt aussieht:
static hasMany = [ posts : Post, likes : Post, dislikes : Post ]
Das problem, dass ich laufen in ist, dass wenn ich etwas hinzufügen, um die posts Liste, wird es auch irgendwie in die Vorlieben und Abneigungen Listen. Mindestens, das ist, wie es aussieht, wenn ich Durchlaufen jede dieser Listen.
Ich denke, dass das Problem ist, dass ich auch die folgende Beziehung in meinem Beitrag domain:
static belongsTo = [ contributer : Contributer ]
Was ist der beste Weg zu gehen über die Konfiguration dieser Beziehungen, um mein Modell funktionieren? Irgendwelche Vorschläge?
@Wayne,
Ich habe versucht, mit Ihr test hat es erfolgreich bestanden. Also, das einzige, was ich mir vorstellen kann ist, dass es etwas falsch mit meinem save-Methode in meinem PostController. Ich klebte die relavent code unten (ich bin mit dem Spring-Security-Core-plugin, und meine Mitwirkender Klasse erweitert die User-Klasse, die erstellt wird, mit diesem plugin):
@Secured(['IS_AUTHENTICATED_FULLY'])
def save = {
def props = [title:params.title, post:params.post, category:Category.get(params.category.id)]
def user = Contributer.get(springSecurityService.principal.id)
def postInstance = new Post(props)
postInstance.contributer = user
if (postInstance.save(flush: true)) {
flash.message = "${message(code: 'default.created.message', args: [message(code: 'post.label', default: 'Post'), postInstance.id])}"
redirect(action: "show", id: postInstance.id)
}
else {
render(view: "create", model: [postInstance: postInstance])
}
}
Gibt es alles, was hier steht?
- wenn Sie hinzufügen, einen Beitrag zu der Mitwirkender tun Sie 'myPost.Mitwirkender=myContributer' oder 'myContributer.addToPosts(myPost)' ?
- danke für die Antwort. Ich habe beide Wege ausprobiert, mit dem gleichen Ergebnis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie ein eins-zu-viele zwischen der Post und Beitrag (post hat ein Autor, der Autor hat viele Beiträge) sowie zwei viele zu viele-Beziehungen zwischen der Post und Beitrag (post hat viele likers, likers, wie viele posts) (post hat viele dislikers, dislikers mögen viele posts). Die
belongsTo
im Post erklärt das Verhalten, aber es zu entfernen wird das problem nicht beheben, erstellen Sie einfach verschiedene. Das Endergebnis ist, dass GORM Konventionen fallen kurz, so dass Sie haben, um zu sagen, GORM, wie man sich Verhalten oder Modell Dinge differntly.Gibt es mehrere Optionen, aber die eine, die springt in den Sinn ist die Modellierung getrennt Abstimmen von Post und machen es so, dass ein Mitarbeiter
hasMany
likeVotes undhasMany
dislikeVotesGORM wird dieses Modell als eine Stimme-Tabelle mit einer Diskriminator-Spalte zu trennen, Vorlieben und Abneigungen; auf diese Weise können Sie beseitigen die Konflikte zwischen den Vorlieben, Abneigungen und erstellte Beiträge.
Dann im Beitrag
Die Beziehungen sind geklärt, nun:
GORM kann verstehen, diese Beziehungen und wird sich entsprechend Verhalten.
Wenn Sie nicht wie diese option, wird der nächste Schritt wäre, um geben Sie einen benutzerdefinierten mappings für die Struktur der Datenbank und verwenden Sie dann
mappedBy
zur Unterscheidung der verschiedenen Beziehungen. Dies ist der Ansatz zu nehmen, wenn Sie absolut wollen, um einen Beitrag beziehen sich direkt auf die Post drei verschiedene Möglichkeiten.Verwenden statische mappedBy in Ihrer Domäne Klasse
Beispiel:
In viele side-domain-Objekt (Mitwirkender.groovy):
In einer Seite domain-Objekt (Post.groovy):
Obwohl Standardverfahren für multi-M:M ist die Verwendung joinTable, wie empfohlen, in GRAILS-4884.
Können Sie den Testfall fehlschlägt? Ich lege, was ich denke ist Ihr Fall in einer grails 1.3.7 Projekt, und der test ist erfolgreich:
}
Versuchen Sie die Umstellung zu einem viele-zu-viele-Beziehung und definieren ein mapping domain-Klasse. In dieser mapping-domain-Klasse können Sie dann angeben, die Art der Beziehung, mögen, nicht mögen, oder Autor.
Können Sie hier schauen, http://www.grails.org/Many-to-Many+Mapping+ohne+Hibernate+XML für weitere Informationen über eine viele-zu-viele-Zuordnung domain-Klasse.
Sollte dies funktioniert: