LocalDateTime 映射到 Oracle DATE,但不映射到 H2 DATE

Posted

技术标签:

【中文标题】LocalDateTime 映射到 Oracle DATE,但不映射到 H2 DATE【英文标题】:LocalDateTime mapped to Oracle DATE, but not to H2 DATE 【发布时间】:2018-10-23 08:40:09 【问题描述】:

假设我有 JPA @Embeddable:

@Embeddable
public class SpecificationValidity     
    @Column(name = "VALID_FROM", nullable = false)
    private final LocalDateTime validFrom;

    @Column(name = "VALID_TO")
    private final LocalDateTime validTo;
   

SQL 表包含列 VALID_FROMVALID_TO,并使用 liquibase 变更集声明如下:

<column name="VALID_FROM" type="date">
    <constraints nullable="false"/>
</column>
<column name="VALID_TO" type="date"/>

当我对 Oracle 数据库运行此代码时,一切正常。

当我针对 H2 数据库运行它时,Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [valid_from] in table [specification]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]

为什么会这样?

是否可以为两个 dbms 提供一致的映射?

【问题讨论】:

你用的是什么版本的休眠? 【参考方案1】:

我假设您使用 Hibernate(来自您的异常消息)。由于您使用的是 java 8 或更高版本,您可能需要将此添加到 hibernate 5.0.x 的依赖项中。

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-java8 -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>5.3.7.Final</version>
</dependency>

这有助于在 Java 8 类型和 JPA 已知类型之间来回转换。在这种情况下,它允许 LocalDateTime LocalDateInstant 等,

我正在发布随之而来的映射(在文章中也有提及)。

参考文章:Hibernate + java 8 datetime

P.S : 对于 Hibernate 5.2x 及更高版本,不需要这种显式依赖。 http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#basic-datetime

【讨论】:

这不是我要找的答案。就我而言,我在 java 类中有 LocalDateTime 我想要保留的内容。 Oracle 中的DATE 也包含秒数,这就是LocalDateTime 正在工作的映射的原因,即使在上面的表格中使用了TIMESTAMP。问题是是否有可能在 H2 中也有类似的东西。 你使用的是什么休眠版本?

以上是关于LocalDateTime 映射到 Oracle DATE,但不映射到 H2 DATE的主要内容,如果未能解决你的问题,请参考以下文章

BUG02 -环境冲突,还是看官方文档 mp版本从3.1.0及以下版本升级到高版本,JDK8日期新类型LocalDateTime等无法映射(报错)

MySQL数据库datetime与LocalDateTime的映射与处理

使用杰克逊的 LocalDateTime 解析

将 LocalDate 转换为 LocalDateTime 或 java.sql.Timestamp

localdatetime前八位怎么截取

vue js java LocalDateTime时间展示问题