# Update-Problem mit Hibernate-Framework



## OWiesbrock (1. Dez 2004)

Tach,
für Leute die sich schon ein wenig mit dem Hibernate-Framework auseinandergesetzt haben habe ich eine schöne kleine Anfrage:
Ich habe mir durch Hibernate mit Daten aus einer MySQL-DB ein entsprechendes Objekt erschaffen. Dieses Objekt enthält wiederum Sets mit weiteren Objekten, die DB-Tabellen entsprechen. Ich habe nun Daten des ersten Objekts geändert und möchte diese nun in der DB aktualisieren. Dazu rufe ich saveOrUpdate(Object o) aus dem Framework auf (Session und Transaction sind natürlich geöffnet).
Alle Daten des ersten Objekts, die nicht in den Sets enthalten sind, werden durch ein erstes Update problemlos aktualisiert, wenn Hibernate nun jedoch beginnt die Sets auszulesen und SQL-Strings zu erstellen sieht der Output etwa so aus:
_update projekt_ma set ma_id=null where ma_id=?_
Die ma_id ist die MitarbeiterID und ist Teilschlüssel der Tabelle projekt_ma. Kann mir einer vielleicht erklären warum Hibernate versucht diese ID auf null zu setzten? Noch besser wäre es wenn mir einer einen Lösungsvorschlag anbieten könnte.

Danke
OWiesbrock


----------



## Bleiglanz (2. Dez 2004)

hast du dein Mapping

Set im Objekt   =====  Fremdschlüssel in der DB

auch richtig im der Mapping Datei eingetragen?


> Die ma_id ist die MitarbeiterID und ist Teilschlüssel der Tabelle projekt_ma. Kann mir einer vielleicht erklären warum Hibernate versucht diese ID auf null zu setzten? Noch besser wäre es wenn mir einer einen Lösungsvorschlag anbieten könnte.


ohne Kenntnis der Datenbankstruktur (Relationen), deiner Klasse und der MappingDatei unmöglich


----------



## Guest (2. Dez 2004)

Das Mapping-File sieht an entsprechender Stelle so aus:


> <set name="projekte" table="projekt_ma" lazy="true" inverse="false">
> <key column="ma_id" />
> <one-to-many class="de.fourthproject.controlling.hibernate.ProjektMa" />
> </set>



und bei ProjektMA sieht es so aus:


> <class name="ProjektMa" table="projekt_ma">
> <composite-id name="id" class="ProjektMaKey">
> <key-many-to-one name="mitarbeiter" column="ma_id" class="Mitarbeiter"/>
> <key-many-to-one name="projekt" column="proj_id" class="Projekt"/>
> ...



Wie müsste ich dass denn jetzt verändern?


----------



## Bleiglanz (2. Dez 2004)

> Die ma_id ist die MitarbeiterID und ist Teilschlüssel der Tabelle projekt_ma.


Also ist ma_id ein Fremdschlüssel? Und gleichzeitig Teil des Primärschlüssels? Was soll mit "Teilschlüssel der Tabelle" gemeint sein?

Wenn sich dein Set verändert hat, wird Hibernate versuchen, die "fehlenden" zugeordneten projek_ma's durch null-Setzen des Fremschlüssels auf der projekt_ma Seite zu löschen, deswegen das update kommando

Hast du das Set vor dem update verändert?


----------



## OWiesbrock (2. Dez 2004)

Ja ma_id kommt aus der Tabelle Mitarbeiter und ist Fremdschlüssel und gleichzeitig ein Teil des primärschlüssel von Projekt_ma. Die Sets die ich habe, besitzen alle bisher in der DB vorhandenen Einträge (ggf. um einen Wert geändert, aber definitv nicht der PK), sowie ggf neue Einträge.


----------



## Bleiglanz (2. Dez 2004)

hmm, habe nochmal neu nachgedacht

>> update projekt_ma set ma_id=null where ma_id=? 

klingt eher so, als ob das Zielobjekt gelöscht wurde und Hibernate die fehlenden Referenzen NULLen möchte, hatt dein Objekt o bei

saveOrUpdate(o)

wirklich einen bestehenden gültigen PK? 

kann mich leider nicht weiter damit befassen (One-2-Manys sind beim OR-Mapping eh schon kompliziert; dazu noch ein Foreign-Key als Teil des Primärschlüssels [kann nicht NULL werden!] - da bräuchte ich ein paar Stunden dafür


----------

