Java.time包上的异常

Java.time包上的异常,java,database,hibernate,exception,orm,Java,Database,Hibernate,Exception,Orm,我之所以使用Hibernate 5.0.0CR1,是因为它能够使用JDK8时间包,但是当我尝试持久化实体时,我在这段代码中遇到了一个异常。有人能告诉我发生了什么,以及如何修复它吗?我正在使用EntityManagerAPI 映射: @Temporal(TemporalType.TIMESTAMP) @Column(name = "Creation_Date", nullable = false) private final ZonedDateTime creationDate; 例外情况: C

我之所以使用Hibernate 5.0.0CR1,是因为它能够使用JDK8时间包,但是当我尝试持久化实体时,我在这段代码中遇到了一个异常。有人能告诉我发生了什么,以及如何修复它吗?我正在使用
EntityManager
API

映射:

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "Creation_Date", nullable = false)
private final ZonedDateTime creationDate;
例外情况:

Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property

您需要更改creationDate的类型。对于时态注释所需的内容,即java.util.Date或java.util.Calendar属性,该错误非常具体,而ZonedDateTime两者都不实现。不要将ZoneDateTime实现的java.time.temporal.temporal接口与javax.persistence.temporal注释混淆

使用其中一个,它就会工作

关于这一点,专家们也非常清楚:

必须为持久字段或属性指定此批注 类型为java.util.Date和java.util.Calendar。可能只是 为这些类型的字段或属性指定

我建议使用日期字段而不是日历字段,因为日历基本上为日期字段提供getter和setter,这会带来一些开销。 仅当您实际需要执行日期/时间计算或格式化日期以便向用户显示时才使用日历

解决方案示例

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "Creation_Date", nullable = false)
private Date creationDate;

在将日期转换为ZoneDateTime时,我也遇到了类似的问题,您可以应用注释“@CreationTimestamp”而不是@Temporal(TemporalType.TIMESTAMP),它会起作用

@CreationTimestamp
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private final ZonedDateTime creationDate;

这个例外信息说明了一切。关于它,你有什么不明白的?@Raedwald不是hibernate 5.0.0CR1应该与
java.time
兼容吗?为什么不把它转换成正确的数据库格式呢?5.0.0CR1版本的要点不就是我可以在我的类中使用
java.time
?为什么我需要将其更改为旧的(更糟糕的)日期格式?没有人强迫您使用时态注释。它的行为和我描述的一样。还要记住,在坚持使用TemporalType.DATE、TemporalType.TIME或TemporalType.TIMESTAMP中的一种时。您可以自由地将列映射到另一个字段,也可以为ZoneDateTime编写自己的转换器。已经有人谈到为新的Java8时间类添加对@Timestamp的支持。Hibernate确实添加了对Java8日期和时间类型的支持,但我还没有看到它的任何用法