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

mem*_*und 17 java mysql junit hibernate h2

我希望我的实体在更新时有一个修改时间戳.mysql使用以下定义支持此操作:

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

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

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

Ale*_*rov 9

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

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

你可以做几件事.其中一些是黑客.

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

@Column(columnDefinition ="更新CURRENT_TIMESTAMP时TIMESTAMP默认CURRENT_TIMESTAMP")private LocalDateTime thetime

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

  2. 如果必须由数据库生成时间戳,则可以执行与生成ID的方式类似的操作.有一些专用对象从数据库中读取CURRENT_TIMESTAMP,并在保持更新之前将其置于实体之前.