10

我正在用 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;

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

4

3 回答 3

9

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

于 2013-03-01T21:44:37.370 回答
0

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

@Transaction(propagation = Propagation.NEVER)

注意:该注释来自 Spring,对于您正在运行的环境可能还有其他内容。

于 2014-10-31T20:11:44.143 回答
0

请注意,如果您正在生成休眠 pojo,您也可以使用CreationTimestamp. 我刚试过,它似乎工作!

  @CreationTimestamp
  protected LocalDateTime createdDate;
于 2021-02-24T13:48:35.973 回答