Mehrere hasMany-Beziehungen zur gleichen Domänenklasse in Grails

7

Ich verwende Grails und ich habe ein Domain-Modell mit mehreren hasMany-Attributen für dieselbe Domain-Klasse, das folgendermaßen aussieht:

%Vor%

Das Problem, auf das ich stoße, ist, dass wenn ich etwas zur Liste der Posts hinzufüge, es auch irgendwie in die Likes und Dislikes-Listen gelangt. Zumindest sieht es so aus, wenn ich durch jede dieser Listen iteriere.

Ich denke, dass das Problem ist, dass ich auch die folgende Beziehung in meiner Post-Domain habe:

%Vor%

Was ist der beste Weg, diese Beziehungen zu konfigurieren, damit mein Modell funktioniert? Irgendwelche Vorschläge?

@Wayne,

Ich habe auch versucht, Ihren Test zu verwenden, und er hat erfolgreich bestanden. Das einzige, was mir einfällt, ist, dass etwas mit meiner Speichermethode in meinem PostController nicht stimmt. Ich habe den folgenden Beziehungscode eingefügt (ich verwende das Spring Security Core-Plugin und meine Contributor-Klasse erweitert die Benutzerklasse, die mit diesem Plugin erstellt wurde):

%Vor%

Gibt es etwas, das hier herausragt?

    
NickForrer 24.09.2011, 02:48
quelle

6 Antworten

12

Das Problem ist, dass Sie eine Eins zu viele zwischen Post und Contributor (Post hat einen Autor, Autor hat viele Beiträge) sowie zwei viele zu viele Beziehungen zwischen Post und Contributor (Post hat viele Likers, Likers wie viele Beiträge ) (Post hat viele Abneigungen, Abneigungen mögen viele Beiträge nicht). Das belongsTo in Post erklärt zwar das Verhalten, aber durch das Entfernen wird das Problem nicht gelöst, sondern nur ein anderes erstellt. Das Endergebnis ist, dass die GORM-Konventionen zu kurz kommen und man GORM sagen muss, wie man sich anders verhält oder Dinge modelliert.

Es gibt mehrere Möglichkeiten, aber die eine, die in den Sinn kommt, ist, Vote separat von Post zu modellieren und es so zu machen, dass ein Contributor hasMany likeVotes und hasMany dislikeVotes

%Vor%

GORM modelliert dies als eine Stimme-Tabelle mit einer Diskriminator-Spalte, um Likes und Dislikes zu trennen; Auf diese Weise können Sie Konflikte zwischen Vorlieben, Abneigungen und verfassten Beiträgen beseitigen.

Dann in Contributor

%Vor%

Die Beziehungen sind jetzt geklärt:

  1. Post hat viele likesVotes
  2. Post hat viele AbneigungenVotes
  3. Der Mitwirkende hat viele likeVotes
  4. Contributor hat viele dislikeVotes
  5. Beitrag hat einen Mitwirkenden
  6. Mitwirkende hat viele Beiträge

GORM kann diese Beziehungen verstehen und sich angemessen verhalten.

Wenn Sie diese Option nicht mögen, besteht der nächste Schritt darin, benutzerdefinierte Zuordnungen für Ihre Datenbankstruktur anzugeben und dann mappedBy zu verwenden, um die verschiedenen Beziehungen zu unterscheiden. Dies ist der Ansatz, wenn Sie einen Contributor direkt auf drei verschiedene Arten mit Post verknüpfen möchten.

    
proflux 26.09.2011, 13:48
quelle
5

Verwenden Sie static mappedBy in Ihrer Domänenklasse

Zum Beispiel:

In vielen Side-Domain-Objekten ( Contribute.groovy ):

%Vor%

In einem Seitendomänenobjekt ( Post.groovy ):

%Vor%     
Sherm273 12.11.2013 23:33
quelle
2

Der Standardweg für Multi-M: M ist jedoch joinTable , wie in GRAILS-4884 empfohlen.

    
Victor Sergienko 01.08.2012 21:28
quelle
1

Können Sie den fehlgeschlagenen Testfall zeigen? Ich lege, was ich denke ist dein Fall in ein Grails 1.3.7-Projekt, und der Test besteht:

%Vor%

}

    
Wayne 24.09.2011 03:38
quelle
1

Wechseln Sie in eine Viele-zu-Viele-Beziehung, und definieren Sie eine Zuordnungsdomänenklasse. In dieser Zuordnungsdomänenklasse können Sie dann den Typ der Beziehung angeben. mögen, nicht mögen oder Autor.

%Vor%

Sie können hier Ссылка nachsehen, um weitere Informationen zu einem Vielen zu erhalten -viele Zuordnungsdomänenklasse.

    
schmolly159 24.09.2011 03:52
quelle
0

Das sollte funktionieren:

%Vor%     
Thermech 15.05.2013 17:39
quelle

Tags und Links