Ich möchte die save() -Methode der Hibernation-Sitzung mithilfe des Spring-Test-Frameworks testen. @Test Methode ist:Wie spült man Daten in db innerhalb einer aktiven Federtransaktion?
@Test
@Transactional
public void testSave() {
User expected = createUser();
getGenericDao().currentSession().save(expected);
User actual = getUser(generatedId);
assertUsersEqual(expected,actual);
}
ich Benutzer in der Datenbank spülen will. Ich möchte meinen Benutzer
getGenericDao().currentSession().save(expected);
Dann Datenbank gehen Ich will nach dieser Methode in der Datenbank sein Federdaten-Framework und holen diese Benutzer durch nächste Zeile gespeichert:
User actual = getUser(generatedId);
Ich habe versucht, Hibernate zu verwenden Spülmethode wie:
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
Es spült meinen Benutzer nicht in die Datenbank! Wenn ich jedoch nicht @Transactional Spring Annotation verwenden und meinen Benutzer in programmatischen Feder-Transaktion speichern, erreiche ich, was ich will. Leider wird der Benutzer, der in db gespeichert wurde, nicht zurückgesetzt, da es keine Feder @Transactional gibt. Daher ändert meine Testmethode die db und das Verhalten der nachfolgenden Testmethoden.
Also muss ich meinen Benutzer in db innerhalb der Testmethode (nicht am Ende) und am Ende der Testmethode Rollback alle Änderungen an db.
UPDATE Vorschlag Verfahren zur Herstellung wie folgt:
@Transactional
public void doSave(User user){
getGenericDao().currentSession().save(user);
}
Und rufen DoSave innen testSave nichts tut. Noch habe ich keinen Benutzer in db nach dem Ausführen dieser Methode. Ich setze Haltepunkt und überprüfe meine DB von der Befehlszeile.
UPDATE Vielen Dank für die Antwort. Das Problem ist, dass die Methode flush() meinen Benutzer nicht in die Datenbank versetzt. Ich habe Isolation.READ_UNCOMMITTED versucht, und mein Benutzer wird nicht in die Datenbank gestellt. Ich kann erreichen, was ich will, aber nur, wenn ich die Feder-Transaktion auf @Test-Methode abstelle und in programmatischer Transaktion speichere. ABER dann wird @Test-Methode nicht zurückgerollt und der gespeicherte Benutzer für nachfolgende @Test-Methoden zurückgelassen. Hier @Test-Methode zum Speichern von Benutzer ist nicht so gefährlich wie @Test-Methode, um Benutzer zu löschen, da es nicht zurückgesetzt wird. Also muss es transaktionale Unterstützung für die @Test-Methode geben, mit der ich meinen Benutzer sowieso nicht in db setzen (oder löschen) kann. Tatsächlich wird der Benutzer nur dann in db versetzt (oder gelöscht), wenn die @Test-Methode beendet und die Transaktion für die @Test-Methode aktiviert ist. So möchte ich meinen Benutzer in db in der Mitte von @Test-Methode speichern und es am Ende von @Test Methode
Vielen Dank!
Können Sie uns auch Ihre GenericDao-Klasse geben? EDIT: eigentlich denke ich, ich sehe das Problem. Die aktuelle Transaktion muss festgeschrieben werden, bevor die Daten tatsächlich in der Datenbank gespeichert werden. Sie benötigen also zwei @Transactional-Methoden: eine zum Speichern und eine weitere zum Laden. –
Bitte schauen Sie, ob ich es richtig gemacht habe –
Schließen. Ich meine zwei Transaktionsfunktionen, die von einer nicht-transaktionalen Funktion aufgerufen werden. Das sollte funktionieren ... –