Spooky (missing) Exceptions (9) – Objekt wird vom (Eclipse) JPA Provider nicht in die Datenbank geschrieben


Umgebung

  • Wildfly 10
  • EE7
  • Eclipselink

Situation

Ein Subobjekt einer Entität (OneToOne), das über cascade = CascadeType.ALL angebunden ist, wird bei merge nicht persistiert.

Analyse

In diesem Fall wurde das Objekt nicht im Oberobjekt instanziiert

 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "repairWarranty", fetch = FetchType.EAGER)
    private StateChange stateChange = null;
  • Bei dem ersten Zugriff auf das Objekt über den getter wurde das Objekt angelegt
  • In einer Livecycle Methode @PostPersist wurde auf das Objekt zum ersten mal zugegriffen

Wenn ein abhägiges Objekt erst in einer Livecycle Methode @PostPersist instanziiert wird, erkennt aktuell (Version 2.6.x) der (Eclipselink) JPA Provider nicht, dass dieses Objekt gespeichert werden muss. Auch wenn ohne ein refresh des Oberobjekts nochmals versucht wird ein merge durchzuführen, werden die Daten nicht in die Datenbank geschrieben (sind aber im Objekt enthalten, was das Debugging deutlich erschwert).

Lösung

Entweder die (indirekte) Instanziierung in den Livecycle Methoden vermeiden oder die Objekte direkt anlegen

 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "repairWarranty", fetch = FetchType.EAGER)
    private StateChange stateChange = new StateChange ();

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

,