LocalDate 的休眠模式验证失败 - 找到日期,但需要时间戳
hibernate schema validation failure for LocalDate - found date, but expecting timestamp
我最近尝试将我的应用程序从 JBoss EAP 7.0 部署到 7.2.4,从那以后我面对 LocalDate
映射到 date
类型列的字段的模式验证问题。
确切的失败消息是:
{"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"project-name.ear#MyPersistenceUnit\"" => "javax.persistence.PersistenceException: [PersistenceUnit: MyPersistenceUnit] Unable to build Hibernate SessionFactory
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: MyPersistenceUnit] Unable to build Hibernate SessionFactory
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [someDate] in table [SOME_TABLE]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]"}}
架构中的片段:
create table SOME_TABLE(
-- primiary key and other columns
someDate date
);
实体中的字段:
@Convert(converter = LocalDateConverter.class)
private LocalDate someDate;
转换器
import java.sql.Date;
import java.time.LocalDate;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class LocalDateConverter
implements
AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate attribute) {
return attribute == null ? null : Date.valueOf(attribute);
}
@Override
public LocalDate convertToEntityAttribute(Date dbData) {
return dbData == null ? null : dbData.toLocalDate();
}
}
我发现按照建议添加 @Column(columnDefinition = "date")
可以解决问题,但我的问题是:
- 在这种情况下我是否需要强制添加
columnDefinition
?
- 该应用程序在 JBoss 7.0 中运行良好。我怎么知道 JBoss 7.2.4 中引入了哪些更改破坏了我的应用程序?
- 解决此问题的任何其他建议。
此问题与 H2 有关,而与 Oracle 连接则没有此问题。
已更新
在 Oracle 模式下使用 DATE 时,您似乎遇到了 Hibernate 与 H2 驱动程序不兼容的问题。参见:https://github.com/h2database/h2database/issues/1824
此外,JBoss 7.2 现在支持 JPA 2.2(参见:https://access.redhat.com/articles/113373)。在 JPA 2.2 中添加了 Java8 时间 类 的支持,例如 LocalDate,因此您可以删除转换器。
JPA 2.2 使用 JDBC4.2。这是 JDBC.
中的对象映射
参见 JDBC 4.2 spec 上的 Table B-4:
我最近尝试将我的应用程序从 JBoss EAP 7.0 部署到 7.2.4,从那以后我面对 LocalDate
映射到 date
类型列的字段的模式验证问题。
确切的失败消息是:
{"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"project-name.ear#MyPersistenceUnit\"" => "javax.persistence.PersistenceException: [PersistenceUnit: MyPersistenceUnit] Unable to build Hibernate SessionFactory
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: MyPersistenceUnit] Unable to build Hibernate SessionFactory
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [someDate] in table [SOME_TABLE]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]"}}
架构中的片段:
create table SOME_TABLE(
-- primiary key and other columns
someDate date
);
实体中的字段:
@Convert(converter = LocalDateConverter.class)
private LocalDate someDate;
转换器
import java.sql.Date;
import java.time.LocalDate;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class LocalDateConverter
implements
AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate attribute) {
return attribute == null ? null : Date.valueOf(attribute);
}
@Override
public LocalDate convertToEntityAttribute(Date dbData) {
return dbData == null ? null : dbData.toLocalDate();
}
}
我发现按照建议添加 @Column(columnDefinition = "date")
- 在这种情况下我是否需要强制添加
columnDefinition
? - 该应用程序在 JBoss 7.0 中运行良好。我怎么知道 JBoss 7.2.4 中引入了哪些更改破坏了我的应用程序?
- 解决此问题的任何其他建议。
此问题与 H2 有关,而与 Oracle 连接则没有此问题。
已更新
在 Oracle 模式下使用 DATE 时,您似乎遇到了 Hibernate 与 H2 驱动程序不兼容的问题。参见:https://github.com/h2database/h2database/issues/1824
此外,JBoss 7.2 现在支持 JPA 2.2(参见:https://access.redhat.com/articles/113373)。在 JPA 2.2 中添加了 Java8 时间 类 的支持,例如 LocalDate,因此您可以删除转换器。
JPA 2.2 使用 JDBC4.2。这是 JDBC.
中的对象映射参见 JDBC 4.2 spec 上的 Table B-4: