Ecliselink @ManyToOne erzeugt Inserts – eclipselink.id-validation


Wenn in einer Entität eine andere mit einer

@ManyToOne

angebunden wurde, prüft Eclipslink, ob die angebundene Entität persistiert werden muss (und eine neue Sequenznummer gewählt werden soll). Wird die angebundene Entität als ungültig klassifiziert, wird ein INSERT erzeugt. Früher konnten die Werte “0” als erlaubte IDs mit der Optionen (in der persistence.xml)

<property name="eclipselink.allow-zero-id" value="true"/>

verwendet werden. War diese true, wurden Entitäten mit einer primitiven ID und dem Wert “0” als gültig eingestuft. Diese Option wurde durch

<property name="eclipselink.id-validation" value="..."/>

ersetzt und erweitert. Vergleiche auch

https://www.eclipse.org/eclipselink/api/2.7/org/eclipse/persistence/config/PersistenceUnitProperties.html

https://www.eclipse.org/eclipselink/api/4.0/eclipselink/org/eclipse/persistence/annotations/IdValidation.html

Bei zusammengesetzten IDs ist NULL default. Bei “einfachen” IDs ist ZERO default. Das hat Folgen! Nehmen wir den Fall:

Entität A (Komp. ID) --@ManyToOne-> Entität B (Komp. ID) --@ManyToOne-> Entität C (ID "0")

In der Standardeinstellung versucht Eclipselinkbeim Speichern von A einen neuen Datensatz von C anzulegen, da die Prüfung der ID “ungültig” liefert. Da der Datensatz mit 0 aber vermutlich schon in der DB ist, wird ein entsprechender Fehler geworfen.

Ich persönlich fände ein NULL als Default Konfiguration besser, da das obige Verhalten aus meiner Sicht nicht unbedingt intuitiv ist. Bei NONE werden ggf. auch Sequenzen nicht erkannt.

Du hast Fragen oder Anmerkungen? Kontakt: arndt@schoenb.de

,