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

2022-09-02 13:57:20

我希望我的实体在每次更新时都有一个修改时间戳。 使用以下定义支持此功能:mysql

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

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

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


答案 1

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

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

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

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

    @Column(columnDefinition = “TIMESTAMP 默认CURRENT_TIMESTAMP在更新CURRENT_TIMESTAMP”) private LocalDateTime thetime

  2. 与数据库无关的替代方法是将时间生成留给应用程序服务器层,并将其挂接到实体上的侦听器@PrePersist@PreUpdate

  3. 如果时间戳必须由数据库生成,则可以执行类似于生成 ID 的方式。有某种专用对象,该对象从数据库中读取CURRENT_TIMESTAMP,并在持久保存,更新之前将其放在实体中。


答案 2

推荐