假设我有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是否可能具有一致的映射?
答案 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
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