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_FROM
和 VALID_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
LocalDate
和 Instant
等,
我正在发布随之而来的映射(在文章中也有提及)。
参考文章: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的映射与处理