如何在带有 JUnit 的 H2 数据库中使用“更新 CURRENT_TIMESTAMP”?

Posted

技术标签:

【中文标题】如何在带有 JUnit 的 H2 数据库中使用“更新 CURRENT_TIMESTAMP”?【英文标题】:How to use "on update CURRENT_TIMESTAMP" in H2 database with JUnit? 【发布时间】:2018-05-25 23:24:33 【问题描述】:

我希望我的实体在更新时具有修改时间戳mysql 使用以下定义支持这一点:

@Entity
public class MyTable 
    @Column(columnDefinition = "TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP")
    private LocalDateTime thetime;

问题:在我的JUnit 测试中,我想使用嵌入式内存H2 数据库。而且H2不支持on update CURRENT_TIMESTAMP

问题:如何保留列定义(因为我将在所有情况下运行 mysql,但在自动化测试中除外)?在我的 h2 测试中如何解决这个问题?

【问题讨论】:

你可以直接在你的数据库属性中设置。 【参考方案1】:

H2 的官方声明是不支持,解决方法是创建触发器。你可以在这里阅读https://github.com/commandos59/h2database/issues/491

无论您在“columnDefinition”中添加什么,它都是特定于提供者的。而且由于您已经使用此特定列定义映射了您的实体,因此您不会给自己留下太多的操作空间。

您可以做几件事。其中一些是黑客。

    为测试混合 XML 配置。 实体的 XML 配置比注释具有更高的优先级,因此您实际上可以使用 H2 特定的列定义覆盖。

    @Column(columnDefinition = "TIMESTAMP 默认 CURRENT_TIMESTAMP 更新 CURRENT_TIMESTAMP") 私有 LocalDateTime 时间

    不知道数据库替代方案是将您的时间生成留给应用程序服务器层并将其挂钩到实体上的@PrePersist@PreUpdate 侦听器

    如果时间戳必须由数据库生成,您可以执行与生成 ID 类似的操作。有某种专用对象从数据库中读取 CURRENT_TIMESTAMP 并将其放入实体,然后再进行持久化、更新。

【讨论】:

以上是关于如何在带有 JUnit 的 H2 数据库中使用“更新 CURRENT_TIMESTAMP”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Servlet 和 JDBC 中为 JUnit 分离 H2 数据库 [关闭]

如何使用Spring Data JPA在H2数据库中保存数据

H2 DB Initial Set Up 脚本在 JUNIT 中被多次调用

Junit+Hibernate+Spring+H2 :inserts 执行没有错误但是 select 没有返回数据

Spring Hibernate H2 Junit 测试 - 如何在启动时加载模式

如何像 sql server 一样在 h2 中使用 getDate()