我使用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,这样可以正常工作......
答案 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")
如果您需要它,则表明您的休眠配置存在严重问题。