Ich steh gerade vor dem kleinen Problem bei einer M:N Beziehung, alles funktioniert nur sobald ich etwas aus der Liste von der Beziehung lösch, löscht Hibernate alle Elemente der Beziehung aus der Verbindungstabelle und fügt die verbliebenen neu ein.
Kennt jemand ne Möglichkeit nur die gelöschten zu entfernen, so das er nicht immer alles löscht und einfügt?
Ich steh gerade vor dem kleinen Problem bei einer M:N Beziehung, alles funktioniert nur sobald ich etwas aus der Liste von der Beziehung lösch, löscht Hibernate alle Elemente der Beziehung aus der Verbindungstabelle und fügt die verbliebenen neu ein.
Sry aber ich kapier nich was du meinst ^^ Nochmal anschaulich bitte
Hört sich für mich aber so an, als ob irgendwas mit nem Cascade nicht stimmt oder diverse Objekte vllt detached sind oder sowas.
Ich hab eine M:N Beziehung, daher hab ich ja 3 Tabellen
Tracks, Tracks_Positions, Positions wenn ich jetzt eine Position lösch, löscht Hibernate alle Positionen zum Track aus der Tracks_Positions um die verbleibenden dann wieder einzufügen.
zwischen den beiden Elementen ist keine M:N Beziehung aber zwischen den Tabellen.
private List<GPSPosition> positions = new Vector<GPSPosition>();```
Der Grund ist der, ich verwende die Position noch in anderen Objekten, daher konnte ich keine 1:M Beziehung machen.
Ich mag nen Set nicht so richtig, weil da kommt man irgendwie immer nur über Iteratoren an die Elemente und soo langsam ist nen Vector auch nicht ;)
Den Grund, warum du keine 1:M Beziehung verwenden kannst, hab ich nicht so ganz verstanden.
Verwende nur testhalber mal anstelle einer List ein Set. Weil so, wie du es jetzt implementiert hast, ist es theoretisch möglich, dass n gleiche Datensätze in die DB geschrieben werden (was auch nicht Sinn und Zweck der Sache ist). Evtl. hat Hibernate damit ja Probleme.
Das von Dir beobachtete Verhalten nennt sich im Hibernate Universum Bag Semantic. In der Doku wirst Du einige Informationen dazu finden.
Bag Semantic würde ich immer vermeiden. Wenn Du eine List brauchst, kannst Du mittels @IndexColumn die Spalte angeben, wo die Position des Elements in der Liste persistent gespeichert wird. Dadurch machst Du aus der Bag Semantic List Semantic und das von Dir beschriebene Problem ist beseitigt.
Die andere Möglichkeit hast Du ja nun schon selbst probiert, Set Semantic. Meiner Erfahrung nach ist das allerdings mit Vorsichtig zu genießen. Es kann nämlich zu häßlichen Exceptions kommen, wenn man equals / hashcode selbst implementiert. Hibernate benutzt diese Methoden natürlich während dem Erzeugen der Entities, wenn sie dem Set hinzugefügt werden. Greift man nun aber in einer der Methoden auf Member zu, die zu diesem Zeitpunkt noch nicht geladen sind, dann wirft Hibernate wenig aussagekräftige Exceptions zur Laufzeit.
Außerdem kann man bei Set Semantic die Reihenfolge der Elemente nicht persistent speichern.