Java.time包的例外

时间:2015-06-04 18:18:18

标签: java database hibernate exception orm

我使用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

2 个答案:

答案 0 :(得分:0)

您需要更改creationDate的类型。该错误对于Temporal注释需要什么是特定的,即java.util.Date或java.util.Calendar属性,而ZonedDateTime既不实现。不要混淆ZonedDateTime实现的java.time.temporal.Temporal接口和javax.persistence.Temporal注释。

使用其中一个,它会起作用。

时间上的java docs对此也很清楚:

  

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

我建议在日历之上使用日期字段,因为日历基本上为日期字段提供了getter和setter,并且它带来了轻微的开销。 仅在实际需要执行日期/时间计算时使用日历,或者将日期格式设置为用户。

解决方案示例

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

答案 1 :(得分:0)

当我从日期转换为ZonedDateTime时,我也遇到类似的问题,您可以应用注释'@CreationTimestamp'而不是@Temporal(TemporalType.TIMESTAMP),它将起作用。

@CreationTimestamp
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private final ZonedDateTime creationDate;
相关问题