Verstoß gegen Eindeutigkeit

javaner08

Aktives Mitglied
Welche Ursachen kann das haben, wenn nach einem Aufruf von
Java:
getHibernateTemplate().saveOrUpdate(<object>);

von Oracle-Server die Fehlermeldung "ORA-00001: Verstoß gegen Eindeutigkeit" kommt ?

Eigentlich sollte doch so ein saveOrUpdate einfach nur einen "Update" durchführen ... hat jemand einen Tipp, wo ich mit der Fehlersuche anfangen kann ?
 
Wenn ich an der Stelle, wo jetzt der SaveOrUpdate steht, einfach nur einen Update durchführe, dann funktioniert alles einwandfrei.

Daher meine Frage :
Wieso führt Hibernate dann bei Aufruf von "SaveOrUpdate" nicht einfach einen Update durch anstatt einen Insert zu versuchen und dann mit obiger Fehlermeldung abzubrechen ?
 
Hibernate erkennt anhand des State des Java-Objekts, ob eine Entiy bereits persistiert wurde. Dazu kann folgendes benutzt werden:
ID-Feld == null --> noch nicht persisitert --> INSERT, != null --> schonmal persisitert --> UPDATE
Version-Feld ... (Mechanismus wie bei ID-Feld)

Wenn du weder ein nullbares Version-Feld noch ID-Feld hast, weil du statt der Wrapper primitive Datentypen verwendest (z.B. long oder int), dann musst Du Hibernate beim Mapping sagen, welchen Wert es als "not persisted" annehmen soll (üblicherweise 0, weil das der Defaultinitialisierung enspricht).

Ich rate aber zu nullable Types.
 
Wenn ich an der Stelle, wo jetzt der SaveOrUpdate steht, einfach nur einen Update durchführe, dann funktioniert alles einwandfrei.

Daher meine Frage :
Wieso führt Hibernate dann bei Aufruf von "SaveOrUpdate" nicht einfach einen Update durch anstatt einen Insert zu versuchen und dann mit obiger Fehlermeldung abzubrechen ?

Wie Nillehammer es schon treffend beschrieben hat:

Hibernate denkt, dass dein Objekt noch nicht persistiert wurde und führt daher das Save und nicht das Update der Funktio auf 😉.

Eventuell magst du uns ja noch ein bissl mehr Quelltext zukommen lassen? 😉
 

Neue Themen


Zurück
Oben