>> WebApplikation, JSF 2.0 / JPA (EclipseLink) / Tomcat 8.x <<
Irgendwie bringe ich es nicht fertig, ein in Session verwaltetes Objekt mit put(key, newValue) zu ersetzten!
Folgendes Szenario (JSF & JPA):
MyEntity e = (MyEntity)FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().get("key");
und den Version-Wert anschaue, ist der Version-Wert unverändert geblieben (gleich wie vor dem put-Aufruf). Die Schlussfolgerung ist, dass die Entity nicht ersetzt wurde (wie dies bei einer Mappe der Fall sein sollte). Jede wetere Änderung auf der aus der Session neu geholte Entity (mit EntityManager) führt dazu, dass die OptimisticLockException geworfen wird.
Wenn ich aber zuvor noch die Entity aus der Session entferne, dann funktioniert es:
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().remove("key");
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put("key", newEntity);
Die Sessin-Map Klasse ist die Klasse com.sun.faces.context.SessionMap, die aber von java.util.AbstractMap<String, V> abgeleitet wird. Laut API-Doku müsste die Methode put das vorhandene value-Objekt mit dem neuen Objekt ersetzten. Aber, das ist die Theorie ...
Mache ich hier einen Überlegungsfehler, oder woran kann es liegen?
Vielen Dank
Irgendwie bringe ich es nicht fertig, ein in Session verwaltetes Objekt mit put(key, newValue) zu ersetzten!
Folgendes Szenario (JSF & JPA):
- Eine in Session verwaltete Entity wird aus der Session geholt
- die Entity wird danach updatet (Feld 'version' wird verwaltet --> optimistic locking)
- eine Kontrolle ergibt, dass der Version-Wert der zurückgegebenen Entity um Eins erhöht wurde und somit um Eins höher als der Wert der in Session verwaltete Entity ist: Alles OK
- jetzt wird die erhaltene Entity in Session geschrieben: FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("key", newEntity);
MyEntity e = (MyEntity)FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().get("key");
und den Version-Wert anschaue, ist der Version-Wert unverändert geblieben (gleich wie vor dem put-Aufruf). Die Schlussfolgerung ist, dass die Entity nicht ersetzt wurde (wie dies bei einer Mappe der Fall sein sollte). Jede wetere Änderung auf der aus der Session neu geholte Entity (mit EntityManager) führt dazu, dass die OptimisticLockException geworfen wird.
Wenn ich aber zuvor noch die Entity aus der Session entferne, dann funktioniert es:
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().remove("key");
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put("key", newEntity);
Die Sessin-Map Klasse ist die Klasse com.sun.faces.context.SessionMap, die aber von java.util.AbstractMap<String, V> abgeleitet wird. Laut API-Doku müsste die Methode put das vorhandene value-Objekt mit dem neuen Objekt ersetzten. Aber, das ist die Theorie ...
Mache ich hier einen Überlegungsfehler, oder woran kann es liegen?
Vielen Dank