| 

.NET C# Java Javascript Exception

mappedBy mit zwei Objekten derselben Klasse

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


mappedBy mit zwei Objekten derselben Klasse

christian - 27.01.2008 01:56
Hallo,

ich möchte eine textliche Beschreibung des Unterschieds zweier Objekte speichern. Dazu habe ich eine Klasse "Unterschied", die Referenzen auf die beiden zu unterscheidenden Objekte der Klasse "Artikel" enthält. Problematisch ist allerdings das kaskadierende Löschen, weil man nur ein bestimmtes der beiden referenzierten Objekte löschen kann.

Ich habe eine Klasse
class Artikel {
  String name
  static hasMany = [unterschiede:Unterschied]
  static mappedBy = [unterschiede:"artikel1"]
}
Die Unterschiede zwischen zwei Objekten der Klasse "Artikel" werden mit folgender Klasse gespeichert
class Unterschied {
  static belongsTo = [artikel1:Artikel, artikel2:Artikel]
  String beschreibung
}
Wenn man auf der n-Seite der 1:n-Beziehung zwei Attribute hat, die beide den Typ der Klasse der 1-Seite haben, muss man laut Doku angeben, auf welches der Attribute sich die Verbindung bezieht. In meinem Beispiel sieht das so aus:
static mappedBy = [unterschiede:"artikel1"]
Das bedeutet aber, dass das kaskadierende Löschen nur Funktioniert, wenn man das Artikel-Objekt löscht, das in dem Attribut "artikel1" der Klasse "Unterschied" gespeichert ist. Löscht man den Artikel, der in dem Attribut "artikel2" gespeichert ist, gibt es eine SQLException aufgrund einer Integritätsverletzung. Hibernate kann dann nicht die Verbindung zum abhängigen Unterschied-Objekt herstellen.

Natürlich ist es sinnlos, den Unterschied zu speichern, wenn eins der beiden Artikel-Objekte fehlt. Man müsste Grails mitteilen können, dass sich die Referenz auf das eine oder andere Attribut bezieht. Folgendes Konstrukt funktioniert nicht
static mappedBy = [unterschiede:"artikel1", unterschiede:"artikel2"]
Das führt nur dazu, dass der erste Wert in der Map durch den zweiten überschrieben wird und sich die Assoziation jetzt nur auf "artikel2" bezieht. Einen der Schlüssel umzubenennen (z. B. "unterschiede2") hilft auch nicht.

Man könnte die referentielle Integrität zwar durch ein selbstgebautes Konstrukt im Controller sicherstellen, indem man das betroffene Unterschiedsobjekt sucht und vor dem Artikel-Objekt löscht. Aber vielleicht gibt es ja auch eine eingebaute Lösung, die ich nur nicht kenne. Gibt es eine Grails-Lösung, wie man die Beziehung von einer Klasse im einen oder anderen Attribut der abhängigen Klasse speichern kann?

Gruß
Christian


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "mappedBy mit zwei Objekten derselben Klasse" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.