H2数据库默认值TIMESTAMP列

H2数据库默认值TIMESTAMP列

问题描述:

我正在用H2数据库编写集成测试。 我的数据库(生成)初始化包括该脚本(因为生成的连接表中没有此列):H2数据库默认值TIMESTAMP列

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT NOW(); 

这是我创造的记录:

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 

的方法logRecentIntegrations(.., ..)只是调用DAO和DAO做到这一点:

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

在我的测试以后:

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

当我在resultList中调试此测试时,有两条记录(正确),但它们具有相同的时间戳。即使当我在标记为// 1的行上插入断点并等待了一段时间 - 因此插入之间的时间间隔会很大。 (了Thread.sleep - 同样的结果)

我试图修改SQL脚本,以

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 

但随着相同的结果。为什么两个结果都有相同的时间戳?

如文档所述,the function CURRENT_TIMESTAMP始终返回事务内的相同值。此行为与其他数据库相匹配,例如PostgreSQL。

+0

'@服务 @Transactional 公共类UserServiceImpl实现UserService { ... 公共无效logRecentIntegration(龙integrationId,龙用户id){} ' 所以每次调用该方法是在不同的交易,是不是它? – DominikM 2013-03-01 21:56:29

+0

这个我不知道,我对JPA不是很熟悉。但我熟悉H2 :-) – 2013-03-02 08:33:00

+1

@DominikM不,不是。 '@Transactional'的默认传播级别是必需的,这意味着:如果没有事务,则启动新事务。如果存在,请使用那个。我知道,你从测试中称它为单一交易。 – banterCZ 2013-03-29 08:50:25

您可以在测试中添加以下注释以禁用事务。

@Transaction(propagation = Propagation.NEVER)

注意:标注来自春天,有可能是您所内运行环境的东西。