2013-03-01 10 views
6

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?

Odpowiedz

6

Zgodnie z dokumentacją, the function CURRENT_TIMESTAMP zawsze zwraca tę samą wartość w ramach transakcji. To zachowanie pasuje do innych baz danych, na przykład PostgreSQL.

+0

'@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

+0

Nie wiem, nie bardzo znam JPA. Ale ja znam H2 :-) –

+1

@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

0

Możesz dodać następującą adnotację do testu, aby wyłączyć transakcje.

@Transaction(propagation = Propagation.NEVER)

Uwaga: To adnotacja pochodzi z wiosną i tam może być coś innego dla środowiska, które są uruchomione w terminie.