com.sun.faces.context.SessionMap.put(key, value)

rmacher01

Mitglied
>> 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):
  • 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);
Wenn ich die Entity wieder aus der Session hole

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
 

stg

Top Contributor
Berücksichtigt deine equals-Methode das Version-Field? Beziehungweise die geänderten Attribute?

Falls nein, dann hast du darin deine Antwort gefunden. Es gibt keinen Grund "gleiches" mit "gleichem" zu ersetzen. Da kann man sich die mitunter relativ teure Serialisierung sparen.

Angeachtet dessen musst du dir doch auch eigentlich nur die Versionsnummer merken, nicht den ganzen Zustand?!
 

rmacher01

Mitglied
Berücksichtigt deine equals-Methode das Version-Field? Beziehungweise die geänderten Attribute?

Falls nein, dann hast du darin deine Antwort gefunden. Es gibt keinen Grund "gleiches" mit "gleichem" zu ersetzen. Da kann man sich die mitunter relativ teure Serialisierung sparen.

Angeachtet dessen musst du dir doch auch eigentlich nur die Versionsnummer merken, nicht den ganzen Zustand?!

Vielen Dank, genau das war es :mad:

Ich war der Meinung, dass im Fall, dass für ein bestehendes Key ein neues Objekt kommt, das bestehende Objekt ohne wenn und aber ersetzt wird und eine Überprüfung auf Gelichkeit gar nicht durchgeführt wird. So habe ich an die Implementierung der Methode 'equals' gar nicht gedacht. Aber, da war ich halt auf dem Holzweg ... :oops:
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Faces Context nicht mehr erreichbar nach Servlet Aufruf Web Tier 1
I JSF JSF, Tomcat, Server Faces und maven Web Tier 3
feinperligekohlensaeure JSF JSF + Tomcat 9 | HTTP Status 404 |(com.sun.faces.config.ConfigureListener?) Web Tier 1
M System-Event in der faces-config.xml klappt nicht Web Tier 15
J Navigationsregeln in faces-config Web Tier 3
J JSF String cannot be cast to javax.faces.model.SelectItem Web Tier 12
F JSF (JavaServer Faces) - Spaltengestaltung: selectOneRadio Feat. selectItem Web Tier 6
F ADF Faces & Apache Trinidad Web Tier 5
J Faces response aus einem anderen Servlet heraus rendern Web Tier 4
G JSF javax.faces.bean Web Tier 2
I Rich Faces nur mit JBoss oder auch Tomcat? Web Tier 7
G "JavaServer Faces: The Complete Reference" empfehl Web Tier 2
G Undefined component type javax.faces.ViewRoot Web Tier 3
G WARNUNG: JSF1059: WARNING! The com.sun.faces.verifyObjects Web Tier 2
G Validierung mit Java Server Faces Web Tier 4
G JSF JSF 2.3 Converter injection/persistence context -> null Web Tier 2
snatkoeln Mehrere Dyn. Web Projekte im gleichem Context Root Web Tier 0
M Einbindung der context.xml Web Tier 3
L Velocity Context Web Tier 2
thE_29 Tomcat - Applications(Context) bekommen Web Tier 19
S Tomcat JSP context.xml - Standartpfad einstellen Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben