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

时间:2018-10-23 08:40:09

标签: oracle hibernate h2 liquibase

假设我有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 个答案:

答案 0 :(得分:1)

我假设您使用Hibernate(来自您的异常消息)。由于您使用的是Java 8或更高版本,因此可能需要将其添加到休眠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等,

我正在提出随之而来的映射(本文中也提到了)。

Java8 type to jdbc type mapping

参考文章: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