Piszę testy integracji z bazą danych H2. Moja baza danych (generowane) inicjalizacji zawierają ten skrypt (bo generowane dołączyć tabeli nie ma w tej kolumnie):Wartość domyślna bazy danych H2 kolumny TIMESTAMP
ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT NOW();
ten sposób tworzę rekordy:
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
The logRecentIntegrations metodą (.., ..) po prostu wywołuje DAO i DAO to robi:
Query query = entityManager.createNativeQuery(
"INSERT INTO INT_USR (USR_ID, INT_ID) VALUES (?, ?)");
query.setParameter(1, userId)
.setParameter(2, integrationId);
query.executeUpdate();
Później w moim teście:
Query query = entityManager.createNativeQuery(
"SELECT * FROM INT_USR ORDER BY IU_INSDTTM");
List resultList = query.getResultList();
Kiedy debuguję ten test w resultList, są dwa rekordy (poprawne), ale mają one ten sam znacznik czasu. Nawet gdy wstawiłem punkt przerwania na linii oznaczony // 1 i odczekałem chwilę - więc różnica czasu pomiędzy wstawkami byłaby znacząca. (Thread.Sleep - taki sam wynik)
Próbowałem zmodyfikować skrypt SQL
ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
Ale z tego samego rezultatu. Dlaczego oba wyniki mają ten sam znacznik czasu?
'@Service @Transactional public class UserServiceImpl realizuje UserService { ... public void logRecentIntegration (Long integrationId, Long userId) {} ' więc każde wywołanie metody jest w innej transakcji, nie jest to? – DominikM
Nie wiem, nie bardzo znam JPA. Ale ja znam H2 :-) –
@DominikM Nie, nie jest. Domyślny poziom propagacji "@Transactional" jest WYMAGANY, co oznacza: Jeśli nie ma transakcji, rozpoczyna się nowa. Jeśli istnieje, użyj tego. Wiem, że zadzwoniłeś z testu, który jest pojedynczą transakcją. – banterCZ