2013-03-01 7 views
6

Ich schreibe Integrationstests mit H2-Datenbank. Meine Datenbank (generiert) Initialisierung umfassen dieses Skript (weil Tabelle generierte Join ist diese Spalte nicht haben):H2-Datenbank Standardwert von TIMESTAMP Spalte

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT NOW(); 

Dies ist, wie ich Datensätze erstellen:

Integration integrationOne = createIntegration(firstId, "FIRST"); 
Integration integrationTwo = createIntegration(secondId, "SECOND"); 
flushAndClear(); 
userService.logRecentIntegration(integrationOne.getId(), user.getId()); 
flushAndClear(); 
userService.logRecentIntegration(integrationTwo.getId(), user.getId()); //1 

Die Methode logRecentIntegrations (.., ..) nur Anrufe der DAO und die dao tut dies:

Query query = entityManager.createNativeQuery(
    "INSERT INTO INT_USR (USR_ID, INT_ID) VALUES (?, ?)"); 
query.setParameter(1, userId) 
    .setParameter(2, integrationId); 
query.executeUpdate(); 

Später in meinem Test:

Query query = entityManager.createNativeQuery(
    "SELECT * FROM INT_USR ORDER BY IU_INSDTTM"); 
List resultList = query.getResultList(); 

Wenn ich diesen Test in resultList debuggen gibt es zwei Datensätze (korrekt), aber sie haben denselben Zeitstempel. Selbst wenn ich einen Haltepunkt in die mit // 1 markierte Zeile eingefügt habe und eine Weile gewartet habe, wäre die Zeitlücke zwischen den Einfügungen signifikant. (Thread.sleep - gleiche Ergebnis)

Ich habe versucht, das SQL-Skript zu

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 

aber mit dem gleichen Ergebnis zu ändern. Warum haben beide Ergebnisse denselben Zeitstempel?

Antwort

6

Wie dokumentiert, gibt the function CURRENT_TIMESTAMP immer den gleichen Wert innerhalb einer Transaktion zurück. Dieses Verhalten stimmt mit anderen Datenbanken überein, z. B. PostgreSQL.

+0

'@Service @Transactional public class UserServiceImpl Userservice implementiert { ... public void logRecentIntegration (Long integrationId, Lange userId) {} ​​ ' jeder Aufruf der Methode also in verschiedenen Transaktion ist, ist nicht es? – DominikM

+0

Das weiß ich nicht, ich bin mit JPA nicht sehr vertraut. Aber ich kenne H2 :-) –

+1

@DominikM Nein, ist es nicht. Die Standardausbreitungsstufe von @Transactional ist ERFORDERLICH, dh: Wenn keine Transaktion vorhanden ist, wird eine neue gestartet. Wenn vorhanden, benutze diesen. Ich weiß, Sie haben es aus dem test aufgerufen, was eine einzige Transaktion ist. – banterCZ

0

Sie können die folgende Anmerkung zu Ihrem Test hinzufügen, um Transaktionen zu deaktivieren.

@Transaction(propagation = Propagation.NEVER)

Hinweis: Diese Anmerkung aus Frühling kommt und es etwas anderes für die Umwelt sein können, dass Sie innerhalb ausgeführt werden.

Verwandte Themen