hibernate中的Java 8 LocalDate错误地映射到TIMESTAMP

时间:2016-11-09 19:13:24

标签: spring hibernate jpa h2 java-time

我使用Spring boot 1.4.2,它带来了hibernate 5.0.11(JPA 2.1)。 我想在我的实体中使用Java 8时间类,因此包括hibernate-java8

我的实体定义了LocalDate字段。

@Entity
@Table(name = "my_alarms_timeline", indexes = {...})
public class MyAlarm {
    ...
    @Column(name = "validity_date")
    @NotNull
    private LocalDate validityDate;
}

我希望这会映射到H2数据库中的DATE。

在我的数据库中,我将其声明为validity_date DATE NOT NULL,

当我尝试运行测试时,出现以下错误: [INFO] Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [validity_date] in table [my_alarms_timeline]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]

令我惊讶的是,如果我将数据库定义更改为validity_date TIMESTAMP NOT NULL,,我会收到错误

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [validity_date] in table [my_alarms_timeline]; found [timestamp (Types#TIMESTAMP)], but expecting [date (Types#DATE)]

这只是前一个的反向信息。

我也尝试过使用hibernate-java8而不是包含AttributeConverter<LocalDate, java.sql.Date>,但这会产生相同的错误结果。

我该怎么办,以便我的LocalDate正确映射到数据库中的DATE?

我也尝试将LocalDateTime字段映射到TIMESTAMP,这样可以正常工作......

3 个答案:

答案 0 :(得分:13)

所以我通过在columnDefinition="DATE"注释中添加@Column来运行它。

@Entity
@Table(name = "my_alarms_timeline", indexes = {...})
public class MyAlarm {
    ...
    @Column(name = "validity_date", columnDefinition = "DATE")
    @NotNull
    private LocalDate validityDate;
}

不确定为什么没有其他人看到这个问题...

答案 1 :(得分:4)

我在春天没有使用过这个版本,而是在#34;标准&#34; JPA,我做过类似的事情:

$route['default_controller'] = 'main';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

我的表格有&#34;带时区的时间戳&#34;列。我的@Entity然后使用OffsetDateTime。您应该可以使用类似的方式在数据类型之间进行转换。

答案 2 :(得分:2)

我怀疑你的项目中有以下代码:

@EntityScan(basePackageClasses = { Application.class, Jsr310JpaConverters.class })

如果您正在使用Hibernate 5.x,则应删除对Jsr310JpaConverters.class的引用,否则Hibernate和Spring都将尝试处理Java 8 Date和Time对象。这可能会导致一些非常不稳定的行为(例如,在不使用UTC的计算机上运行时,LocalDate实例会以错误的值保留)。

您还应删除所有出现的内容:

@Column(columnDefinition = "DATE")

如果您需要它,则表明您的休眠配置存在严重问题。