Blog

Verwendung des Attributs unsaved-value zur Vermeidung von TransientObjectExceptions in Hibernate

Age Mooij

Age Mooij

Aktualisiert Oktober 23, 2025
1 Minute

Wir sind in unserem Hibernate-aktivierten Code auf eine TransientObjectException gestoßen. Zunächst war die Ausnahme sehr schwer zu reproduzieren und trat nur in sehr seltenen Fällen auf. Manchmal während unserer Integrationstests und manchmal während unserer Smoke-Tests. Wir haben so ziemlich alles versucht, um herauszufinden, warum Hibernate die betreffenden Objekte als ungespeichert (d.h. transient) interpretiert, obwohl wir anhand der SQL-Protokollierung überprüft haben, dass sie tatsächlich in einer früheren Hibernate-Sitzung gespeichert wurden. Es stellte sich heraus, dass Hibernate den Unterschied zwischen den Werten "0" und "null" nicht erkennt, wenn es die ID-Eigenschaft (ein java.lang.Long) betrachtet, um zu prüfen, ob das Objekt persistent ist. Da unsere Oracle-Sequenz bei 0 beginnt, hatte das erste Objekt, das persistiert wurde, eine ID von 0. Als dieses Objekt dann in einer späteren Sitzung verwendet wurde, erkannte Hibernate diesen Wert nicht als gültig und interpretierte das Objekt als transient.Wir haben das Problem behoben, indem wir ein zusätzliches Attribut unsaved-value zu der entsprechenden Zuordnung hinzugefügt haben. Etwa so: [code]

MY_SEQ

[/code] Damit ist das Problem gelöst. Ob es sich dabei um einen Fehler oder eine Funktion in Hibernate handelt, überlasse ich den Lesern als Übung :)

Verfasst von

Age Mooij

Contact

Let’s discuss how we can support your journey.