我使用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
答案 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;