【问题标题】:H2 database default value of TIMESTAMP columnH2数据库TIMESTAMP列默认值
【发布时间】:2013-02-16 11:30:16
【问题描述】:

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

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

【问题讨论】:

    标签: java jpa h2


    【解决方案1】:

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

    【讨论】:

    • @Service @Transactional public class UserServiceImpl implements UserService { ... public void logRecentIntegration(Long integrationId, Long userId) {} 所以对方法的每次调用都在不同的事务中,不是吗?
    • 这个我不知道,我对JPA不是很熟悉。但我对 H2 很熟悉 :-)
    • @DominikM 不,不是。 '@Transactional' 的默认传播级别是 REQUIRED,这意味着:如果没有事务,则启动一个新事务。如果存在,请使用那个。我知道,你从测试中调用它,这是一个单一的事务。
    【解决方案2】:

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

    @Transaction(propagation = Propagation.NEVER)

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

    【讨论】:

      【解决方案3】:

      请注意,如果您正在生成休眠 pojo,您也可以使用 CreationTimestamp。我刚试了一下,好像还可以!

        @CreationTimestamp
        protected LocalDateTime createdDate;
      

      【讨论】:

        猜你喜欢
        • 2012-10-21
        • 2017-01-05
        • 2015-05-02
        • 1970-01-01
        • 2014-07-03
        • 2014-07-15
        • 1970-01-01
        • 2020-12-01
        • 2012-04-01
        相关资源
        最近更新 更多