H2数据库默认值为TIMESTAMP列

时间:2013-03-01 20:48:26

标签: java jpa h2

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

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;

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

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

@Transaction(propagation = Propagation.NEVER)

注意:该注释来自Spring,并且您可能正在运行其他环境。

答案 2 :(得分:0)

请注意,如果您要生成休眠 pojo,您还可以使用 CreationTimestamp。我刚刚试了一下,似乎有效!

  @CreationTimestamp
  protected LocalDateTime createdDate;
相关问题