H2 Datenbank Standardwert der TIMESTAMP-Spalte
Ich Schreibe, integration tests mit der H2 Datenbank.
Meine Datenbank (generiert) Initialisierung enthalten dieses Skript (denn die generierte join-Tabelle nicht über diese 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(.., ..) ruft einfach nur die DAO und das dao tut:
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 debug in diesem test in der resultList gibt es zwei Datensätze (richtig), aber Sie haben den gleichen Zeitstempel. Auch wenn ich eingefügt, ein breakpoint auf Zeile //1 und wartete eine Weile - so die zeitliche Lücke zwischen den Einsätzen erheblich. (Thread.schlafen - das gleiche Ergebnis)
Habe ich versucht zu ändern, das SQL-Skript zu
ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
Aber mit dem gleichen Ergebnis. Warum beide Ergebnisse haben denselben Zeitstempel?
InformationsquelleAutor DominikM | 2013-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dokumentiert, die Funktion CURRENT_TIMESTAMP gibt immer den gleichen Wert innerhalb einer Transaktion. Dieses Verhalten entspricht dem Verhalten in anderen Datenbanken, z.B. PostgreSQL.
@Service @Transactional public class UserServiceImpl implements UserService { ... public void logRecentIntegration(Long integrationId, Long userId) {}
So, dass jeder Aufruf der Methode in andere Transaktion, ist es nicht?Das weiß ich nicht, ich bin nicht sehr vertraut mit JPA. Aber ich bin vertraut mit H2 🙂
Nein, es ist nicht. Standard-übertragungsgrad "@Transactional " ist ERFORDERLICH, was bedeutet: Wenn es keine Transaktion, wird eine neue gestartet. Wenn vorhanden ist, verwenden Sie diesen. Ich weiß, nannten Sie es aus dem test, das ist eine einzelne Transaktion.
InformationsquelleAutor Thomas Mueller
Können Sie fügen Sie die folgende Anmerkung zu Ihrem test zu deaktivieren Transaktionen.
@Transaction(propagation = Propagation.NEVER)
Hinweis: die annotation stammt aus dem Frühjahr, und es kann noch etwas für die Umwelt, die Sie ausgeführt werden innerhalb.
InformationsquelleAutor Jeremy D