2013-03-01 26 views
6

Tôi đang viết bài kiểm tra tích hợp với cơ sở dữ liệu H2. cơ sở dữ liệu của tôi (tạo ra) khởi tạo bao gồm kịch bản này (vì tạo ra tham gia bảng không có cột này):Giá trị mặc định của cơ sở dữ liệu H2 cột TIMESTAMP

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT NOW(); 

Đây là cách tôi có thể tạo hồ sơ:

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 

Các logRecentIntegrations phương pháp (.., ..) chỉ gọi DAO và dao thực hiện điều này:

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

Sau đó trong thử nghiệm của tôi:

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

Khi tôi gỡ lỗi thử nghiệm này trong resultList có hai bản ghi (đúng) nhưng chúng có cùng dấu thời gian. Ngay cả khi tôi đã chèn một điểm ngắt trên dòng được đánh dấu // 1 và đợi một thời gian - vì vậy khoảng cách thời gian giữa các lần chèn sẽ là đáng kể. (Thread.sleep - cùng kết quả)

Tôi cố gắng để thay đổi kịch bản SQL để

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 

Nhưng với kết quả tương tự. Tại sao cả hai kết quả đều có dấu thời gian giống nhau?

Trả lời

6

Theo tài liệu, the function CURRENT_TIMESTAMP luôn trả về cùng một giá trị trong một giao dịch. Hành vi này phù hợp với các cơ sở dữ liệu khác, ví dụ PostgreSQL.

+0

'@Service @Transactional public class UserServiceImpl thực hiện UserService { ... public void logRecentIntegration (Long integrationId, Long userId) {} ​​ ' Vì vậy, mỗi cuộc gọi đến phương pháp này là trong giao dịch khác nhau, không phải là nó? – DominikM

+0

Điều này tôi không biết, tôi không quen thuộc với JPA. Nhưng tôi quen thuộc với H2 :-) –

+1

@DominikM Không, không phải vậy. Mức tuyên truyền mặc định của '@Transactional' là REQUIRED, có nghĩa là: Nếu không có giao dịch, một giao dịch mới sẽ được bắt đầu. Nếu tồn tại, hãy sử dụng cái đó. Tôi biết, bạn gọi nó từ kiểm tra, đó là một giao dịch duy nhất. – banterCZ

0

Bạn có thể thêm chú thích sau vào thử nghiệm của mình để tắt giao dịch.

@Transaction(propagation = Propagation.NEVER)

Lưu ý: chú thích đó xuất phát từ mùa xuân và có thể có cái gì khác cho môi trường mà bạn đang chạy bên trong.

Các vấn đề liên quan