如何使用JUnit在H2数据库中使用“on update CURRENT_TIMESTAMP”?

时间:2017-12-12 10:04:01

标签: java mysql hibernate junit h2

我希望我的实体在更新时有一个修改时间戳。 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 个答案:

答案 0 :(得分:9)

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

阅读

无论您在“ columnDefinition”中输入什么,都是特定于提供程序的。并且由于您已经使用此特定的列定义映射了实体,因此您没有太多的操作空间。

您可以执行几项操作。其中一些是骇客。

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

@Column(columnDefinition =“更新时CURRENT_TIMESTAMP的TIMESTAMP默认CURRENT_TIMESTAMP”)     私人LocalDateTime thetime

  1. 与数据库无关是将时间生成留给应用服务器层,并将其挂钩到实体上的@PrePersist @PreUpdate侦听器

  2. 如果必须由数据库生成时间戳,则可以执行类似于生成ID的方式。有某种专用对象可以从数据库中读取CURRENT_TIMESTAMP并将其作为实体,然后再进行持久存储,更新。