Java 如何使用;更新当前“U时间戳”时;在H2数据库中使用JUnit?

Java 如何使用;更新当前“U时间戳”时;在H2数据库中使用JUnit?,java,mysql,hibernate,junit,h2,Java,Mysql,Hibernate,Junit,H2,我希望我的实体在更新时有一个修改时间戳mysql使用以下定义支持此功能: @Entity public class MyTable { @Column(columnDefinition = "TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP") private LocalDateTime thetime; } 问题:在我的JUnit测试中,我想使用嵌入式inmemoryH2数据库。H2不支持更新当前时

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

@Entity
public class MyTable {
    @Column(columnDefinition = "TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP")
    private LocalDateTime thetime;
}
问题:在我的
JUnit
测试中,我想使用嵌入式inmemory
H2
数据库。H2不支持更新当前时间戳时的


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

h2的官方声明是不支持它,解决方法是创建一个触发器。你可以在这里阅读

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

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

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

    @列(columnDefinition=“TIMESTAMP default CURRENT\u TIMESTAMP on update CURRENT\u TIMESTAMP”) 私有LocalDateTime时间

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

  • 如果时间戳必须由数据库生成,则可以执行与生成ID类似的操作。使用某种专用对象从数据库中读取当前的_时间戳,并在持久化、更新之前将其放入实体


  • 您可以直接在数据库属性中设置此属性。