-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: Löschen einer n:m-Beziehung ohne löschen des Childs
PostPosted: Wed Mar 21, 2007 8:52 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Hallo zusammen,

ich habe im Grunde ein einfaches Problem für das ich aber keine Lösung finde.
Am besten kann man das anhand eines Beispiels erklären, welches ich im Internet gefunden haben:

Es gibt die Entitäten KUNDE und SPEISE. Zwischen beiden besteht eine n:m-Beziehung und eine Tabelle "bestellung" in der nichts weiter gespeichert wird als die beiden Ids. So, soweit so gut.
Die Mappings der beiden sind so aufgebaut, dass sie jeweils ein Set mit Entitäten des anderen enthalten (lazy=true, cascade=save-update, etc).
Eine neue Beziehung zwischen den beiden herzustellen ist also kein Problem.
Das Problem ist aber wie kann ich eine dieser Bezieheungen löschen ohne den jeweiligen Masterdatensatz zu löschen oder ein mapping für die n:m-Tabelle aufzubauen?
Sprich der Kunde bestellt eine Speise ab, womit die Beziehung hinfällig wäre, die Speise muss es aber auch weiterhin geben!
Laut Hibernate Referenz Doku ist eine solche Beziehungsauflösung nur mit dem cascade="all-delete-orphans" oder einem delete (in diesem Fall der Speise) möglich. Ich möchte aber die Speise weiterhin in der Datenbank behalten.
Meine bisher einzige Idee wäre es einen reinen SQL-Delete-Befehl über die Session zu erzeugen und abzuschicken.
Hätte da jemand einen grundlegenden Lösungvorschlag der eher an Hibernate angelehnt ist als pures SQL?

Vielen Dank für Eure Hilfe


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 22, 2007 10:31 am 
Regular
Regular

Joined: Sun Aug 01, 2004 6:49 pm
Posts: 76
Du musst einfach die Objekte jeweils aus den Sets entfernen und abspeichern, dadurch sollte automatisch der Eintrag aus der Verbindungstabelle entfernt werden. Vorsicht allerdings bei sogenannten bidirektionalen Verbindungen. Wenn Du die wirklich brauchst solltest Du das Manual ganz genau studieren, um Konflikte zu vermeiden.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 22, 2007 10:53 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Aber wenn ich Sie nur aus dem Set entferne und speichere so werden doch im Normalfall nicht nur die n:m-Tabelle entsprechende geleert sondern auch das referenzierte Objekt wird gelöscht oder? Das ist hat bisher meine Erfahrung, da dann halt immer ein ForeignKey-Constrint anschlägt wenn es ans Löschen geht.
Oder kann ich das Löschen des referenzierten Objektes beim Löschen der Beziehung über das inverse="false" verhindern, sprich nur die Beziehung ist weg? Ich habe noch nicht ganz realisiert, was ich mit diesem Attribut eigentlich steuere.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 22, 2007 11:46 am 
Regular
Regular

Joined: Sun Aug 01, 2004 6:49 pm
Posts: 76
FPC wrote:
Aber wenn ich Sie nur aus dem Set entferne und speichere so werden doch im Normalfall nicht nur die n:m-Tabelle entsprechende geleert sondern auch das referenzierte Objekt wird gelöscht oder? Das ist hat bisher meine Erfahrung, da dann halt immer ein ForeignKey-Constrint anschlägt wenn es ans Löschen geht.
Oder kann ich das Löschen des referenzierten Objektes beim Löschen der Beziehung über das inverse="false" verhindern, sprich nur die Beziehung ist weg? Ich habe noch nicht ganz realisiert, was ich mit diesem Attribut eigentlich steuere.


n:n Beziehungen benötigen immer eine Zwischentabelle, die jeweils beide Foreignkeys enthalten. Wird die Beziehung aufgelöst, so wird eben nur der Eintrag aus der Zwischentabelle gelöscht. Die Objekte selbst bleiben erhalten.

1:n Beziehungen mit einer ForeignKey-Spalte werden automatisch auf Null gesetzt, wenn ein entsprechendes Objekt aus der Collection (Set) entfernt wird.

Mit "inverse" sagst Du Hibernate, daß das die Seite einer Bidirektionalen Verknüpfung ist, die Hibernate ignorieren soll. Das hindert Dich aber nicht daran eine gültige Verknüpfung ohne inverse herzustellen. Ein Löschen verhinderst du damit zwar implizit auch, ist aber nicht Aufgabe dieses Attributs.

In Hibernate gibt es das delete-orphan für das cascade-Attribut. Das heißt dann explizit, daß alle Objekte, die mit dem zu löschenden verknüpft sind auch gelöscht werden. Nur dann wird der Foreign-Key bei 1:n nicht auf Null gesetzt sondern wie gesagt gleich das ganze Objekt mitgelöscht.

Thomas


Top
 Profile  
 
 Post subject:
PostPosted: Wed Apr 18, 2007 10:07 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Grr Fehler gefunden, im Grunde hatte es nichts mit Hibernate zu tun sondern der Code an der Stelle war falsch unt entfernte die Objekte nur aus einer Arbeitsliste...

Herr wirf Hirn vom Himmel!

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.