我在Entity中有一个字段:
@Column(name = "BILL_DATE")
private LocalDate billDate;
我的系统可以使用oracle
和posthresql
。在posgresql中,此列的类型为timestamp
,在oracle中为date
。当我尝试使用postgeSQL
启动服务器时,出现错误:
wrong column type encountered in column [bill_date] in table [charges]; found [timestamp (Types#TIMESTAMP)], but expecting [date (Types#DATE)]
如果我添加注释@Temporal(TemporalType.DATE)
,则会出现另一个错误:
Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property
但是我不想使用java.util.Date
和java.util.Calendar
。 如何解决此问题?
答案 0 :(得分:1)
Date in Oracle和Timestamp in PostgreSQL都存储日期和。实际上,根据PostgreSQL Documentation,如果时间戳不包含时区,则应将它们映射到LocalDateTime,如果是时区则应将其映射到OffsetDateTime。
Hibernate 5应该支持Java8 Time API,无论如何,如果您使用的是JPA,则可以实现AttributeConverter
import javax.persistence.AttributeConverter;
import java.sql.Timestamp;
import java.time.LocalDate;
public class LocalDateConverter implements AttributeConverter < LocalDate, Timestamp > {
@Override
public Timestamp convertToDatabaseColumn(LocalDate attribute) {
return attribute != null ? Timestamp.valueOf(attribute.atStartOfDay()) : null;
}
@Override
public LocalDate convertToEntityAttribute(Timestamp dbData) {
return dbData != null ? dbData.toLocalDateTime().toLocalDate() : null;
}
}
然后您可以使用
@Convert(converter = LocalDateConverter.class)
@Column(name = "BILL_DATE")
private LocalDate billDate;