2 Stimmen

Die Version wird erhöht, obwohl saveOrUpdate fehlgeschlagen ist

Ich habe eine Tabelle in der Datenbank erstellt durch SQL:

CREATE TABLE `s_supplier` ( 
  `id` int(11) NOT NULL auto_increment,
  `code` varchar(32) collate utf8_bin NOT NULL,
  `name` varchar(128) collate utf8_bin NOT NULL,
  `version` int(11) NOT NULL default '0'
  PRIMARY KEY  (`id`),
  UNIQUE KEY `ui_uom_category_code` (`code`)
)

Die Datenbank hat 2 Zeilen:
(1, code1, name1, 1)
(2, code2, name2, 1)

Mit spring-hibernate:
Schritt 1:
Ich lade Zeile 1 in die Entität und ändere dann den Code zu code2 (wie in Zeile 2). und dann rufe auf
org.springframework.orm.hibernate3.support.HibernateDaoSupport.getHibernateTemplate().saveOrUpdate(entity);
--> Es wird die Ausnahme 'doppelter Code' ausgelöst --> OK

Schritt 2: Ich ändere den Code zu code3 und speichere erneut mit der obigen Methode --> Es wird die Ausnahme 'optimistische Ausnahme, die Zeile wurde von einem anderen Benutzer aktualisiert oder gelöscht' ausgelöst (Ich habe es nur mit einem Benutzer getestet) --> KO

Nachverfolgung habe ich festgestellt, dass nach Schritt 1 die Version automatisch um 1 erhöht wird in der Entität. Ich denke, das sollte nicht passieren, weil eine Ausnahme auftrat.

Meine Frage:

Ist das ein Bug im Spring Framework oder Hibernate?

1voto

Mikko Maunu Punkte 40066

Klingt nicht nach einem Fehler. Ich weiß nicht, ob es im Hibernate-Dokument klar dokumentiert ist, aber das Verhalten entspricht der JPA-Spezifikation:

Ein Transaktions-Rollback führt in der Regel dazu, dass der Persistenzkontext 
zum Zeitpunkt des Rollbacks in einem inkonsistenten Zustand ist. Insbesondere 
können der Zustand von Versionsattributen und generierten Zuständen (z.B. 
generierte Primärschlüssel) inkonsistent sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X