Hibernate aktualisiert Datensatz - Wicket nicht

8

Ich arbeite an einer Webanwendung mit Wicket, Spring und Hibernate und habe ein Problem mit der Aktualisierung von Datensätzen. Ich habe überprüft, dass die saveOrUpdate-Methode aufgerufen wurde und dass sich die Daten im Domänenobjekt geändert haben. Die SQL-Ausgabe zeigt jedoch nicht an, dass Änderungen an der Datenbank vorgenommen wurden (UPDATE in Beispiel) und der betroffene Datensatz wurde nicht aktualisiert.

Ich würde sagen, dass es sinnvoller ist, update () zu verwenden, aber ich saveOrUpdate () schafft zwar neue Datensätze, aktualisiert sie aber nicht. Ich habe überprüft, dass diese Methode aufgerufen wird, und das übergebene UserVO enthält die aktualisierten Felder. Hier ist die DAO-Methode: %pr_e%

Hier ist meine Eigenschaftendatei: %pr_e%

Hier ist die Bean sessionFactory in applicationContext.xml: %pr_e%

Hoffentlich kann einer von euch mir helfen.

Aktualisiert Hier sind einige Informationen aus dem Protokoll (onSubmit () löscht diese Einträge im Protokoll - der letzte Eintrag sollte sein, wenn die Anfrage auf eine andere Seite umgeleitet wird (nachdem der Datensatz es haben sollte) wurde aktualisiert).

%Vor%

Aktualisieren Sie 2 Hier ist der UserVO ohne die Getter / Setter %pr_e%

%Vor%

}

    
John 22.07.2010, 21:03
quelle

2 Antworten

25

Hibernate verschiebt Updates oft, bis die Sitzung geleert wird. Um zu testen, ob dies in Ihrem Fall der Fall ist, fügen Sie nach Ihrer Update-Anweisung ein getSession().flush() ein.

Wie verwalten Sie Transaktionen? Das Flushing wird automatisch ausgeführt, wenn die Sitzung festgeschrieben wird. Wenn Sie jedoch eine fehlerhafte Transaktionskonfiguration haben, können Sie möglicherweise die JDBC-Verbindung festschreiben, aber nicht die an die Hibernate-Sitzung gebundene Transaktion festschreiben.

Bearbeiten: Aufgrund Ihrer Aktualisierung sehe ich, dass FlushMode in einer Zeile auf NIE gesetzt ist:

%Vor%

Ich vermute, das ist das Problem. Dadurch wird die Sitzung nie automatisch geleert. Dies ist normalerweise das, was Sie in einer schreibgeschützten Transaktion tun möchten, nicht wenn Sie Daten ändern. Es scheint, als ob Sie ohne Transaktionen laufen (Autocommit auf True gesetzt - was übrigens nicht empfohlen wird). Das Javadoc für OpenSessionInViewFilter bietet einige Hinweise:

  

Dieser Filter wird die Hibernate-Sitzung standardmäßig nicht löschen, wenn der Flush-Modus auf FlushMode.NEVER festgelegt ist. Es wird davon ausgegangen, dass es in Kombination mit Service-Layer-Transaktionen verwendet wird, die das Flushing betreffen: Der aktive Transaktionsmanager ändert während einer Lese- / Schreib-Transaktion vorübergehend den Flush-Modus in FlushMode.AUTO, wobei der Flush-Modus am Ende auf FlushMode.NEVER zurückgesetzt wird jeder Transaktion. Wenn Sie diesen Filter ohne Transaktionen verwenden möchten, sollten Sie den Standard-Flush-Modus (über die Eigenschaft "flushMode") ändern.

Mit anderen Worten, Sie haben zwei Optionen: Setzen Sie flushMode in Ihrem OpenSessionInViewFilter auf AUTO, oder deaktivieren Sie Autocommit und konfigurieren Sie einen Transaktionsmanager wie HibernateTransactionManager .

    
waxwing 22.07.2010, 22:55
quelle
6

Da Sie Spring verwenden, würde ich Ihnen empfehlen, Spring's PlatformTransactionManager zu verwenden, um Ihre Transaktionen zu verwalten. Im Rahmen der Transaktionsverwaltung spült Spring die Sitzung automatisch. Dies bedeutet, dass Sie sich in Ihrem Code keine Gedanken über diese Aspekte machen müssen.

Spring verfügt über einen OpenSessionInViewFilter, der sich mit dem Transaktionsmanager verbindet, um Sitzungen zu starten / zu leeren, und Sie können Ihre Methoden mit Spring @Transactional versehen, um anzugeben, dass Sie eine Transaktion für eine bestimmte Methode schreiben möchten. Dies sollte Ihre Aufzeichnungen aktualisieren.

    
Vineeth 23.07.2010 10:55
quelle

Tags und Links