Wie werden die @Version-Felder manuell mit Hibernate 4 festgelegt?

8

Umgebung:

Ich habe das User entity:

%Vor%

Ich habe eine Suchseite, die Benutzer auflistet, dann klicke ich auf einen Benutzer, um ihn zu bearbeiten (indem ich seine userId in der URL gebe).

Im Bearbeitungsformular speichere ich die Felder dieser Entität auf dem Server, und wenn ich meinen Benutzer speichere, mache ich das:

%Vor%

Frage:

Wenn ich also das optimistische Sperren mit Hibernate richtig verstanden habe, wenn ich zwei Registerkarten in meinem Browser öffne, um denselben Benutzer zu bearbeiten, dann die Anmeldung auf der ersten Registerkarte und dann das Login auf der zweiten Registerkarte, sollte ich ein OptimisticLockException sollte ich nicht?

Eigentlich ist das bei meiner Anwendung nicht der Fall ... Ich habe überprüft, dass die form.getVersion() in beiden Fällen denselben Wert liefert, auch wenn bei der zweiten Aktualisierung die user.version durch die erste Änderung aktualisiert wurde .

Vermisse ich etwas?

Die EntityManager wird @RequestScoped erzeugt (also bin ich auf zwei verschiedenen EntityManager s, wenn ich versuche zu verschmelzen ...).

Ich habe versucht, ein entityManager.lock(user, LockModeType.OPTIMISTIC_FORCE_INCREMENT) vor entityManager.merge(...) ( wie hier gesagt ), aber es hat nicht geholfen.

Ich benutze Seam 3 mit JBoss 7.0.2.Final (welches Hibernate 4 verwendet).

    
Anthony O. 06.02.2012, 15:49
quelle

2 Antworten

4

Tatsächlich habe ich einen Weg gefunden, dies zu tun ... aber ich denke, es ist nicht wirklich effizient (weil es noch eine SELECT-Anfrage gibt).

%Vor%

Mit entityManager.detach(user) verwendet Hibernate jetzt meinen gesetzten version -Wert anstelle seines eigenen irgendwo kopierten Wertes ...

    
Anthony O. 15.02.2012, 18:49
quelle
5

Ich habe gerade mehr darüber geforscht.

Es ist nicht erlaubt, das Versionsfeld gemäß der JPA-Spezifikation zu ändern:

JPA 2.0 Finale Spec, Abschnitt 3.4.2:

  

Eine Entität kann auf den Status ihres Versionsfelds oder ihrer Eigenschaft zugreifen oder eine Methode exportieren, die von der Anwendung für den Zugriff auf die Version verwendet wird, aber darf den Versionswert nicht ändern . Mit Ausnahme der in Abschnitt 4.10 genannten Ausnahme darf nur der Persistenzanbieter den Wert des Versionsattributs im Objekt festlegen oder aktualisieren.

Hinweis: Abschnitt 4.10 bezieht sich auf Batch-Updates, die das Versionsattribut ignorieren.

    
chkal 28.06.2013 09:51
quelle