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?
'@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
Das weiß ich nicht, ich bin mit JPA nicht sehr vertraut. Aber ich kenne H2 :-) –
@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