从日期到java.time.LocalDate的JPA转换器不适用于Glassfish 4.1

从日期到java.time.LocalDate的JPA转换器不适用于Glassfish 4.1,java,oracle,jpa,glassfish,eclipselink,Java,Oracle,Jpa,Glassfish,Eclipselink,我制作了一个转换器,当我从数据库中读取日期字段时,它应该能够将它们强制为java.time.LocalDate对象。但是,当我尝试这样做时,它会给我以下错误: The object [3/16/17 12:00 AM], of class [class java.sql.Timestamp], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[startDate-->TEST_TABLE.START_D

我制作了一个转换器,当我从数据库中读取日期字段时,它应该能够将它们强制为
java.time.LocalDate
对象。但是,当我尝试这样做时,它会给我以下错误:

 The object [3/16/17 12:00 AM], of class [class java.sql.Timestamp], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[startDate-->TEST_TABLE.START_DATE]] with descriptor [RelationalDescriptor(com.test.TestEntity --> [DatabaseTable(TEST_TABLE)])], could not be converted to [class [B].
TEST\u TABLE
是我的表,它有一列
START\u DATE
,类型为
DATE
。以下是转换器:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.sql.Date;
import java.time.LocalDate;

@Converter(autoApply = true)
public class OracleLocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
    @Override
    public Date convertToDatabaseColumn(LocalDate attribute) {
        return (attribute != null ? Date.valueOf(attribute) : null);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date dbData) {
        return (dbData != null ? dbData.toLocalDate() : null);
    }
}
import javax.persistence.AttributeConverter;
导入javax.persistence.Converter;
导入java.sql.Date;
导入java.time.LocalDate;
@转换器(自动应用=真)
公共类OracleLocalDateAttributeConverter实现AttributeConverter{
@凌驾
public Date convertToDatabaseColumn(LocalDate属性){
return(attribute!=null?Date.valueOf(attribute):null);
}
@凌驾
公共LocalDate convertToEntityAttribute(日期数据库数据){
返回(dbData!=null?dbData.toLocalDate():null);
}
}
为什么它认为我的专栏是一个时间戳?oracle中的所有日期是否都强制为
java.sql.Timestamp

该类是持久性提供程序用来从数据库解析日期的类,而不管该值是否只是一个日期。这是有意义的,因为它允许持久性提供程序获取DATETIME或时间戳的时间部分。请注意,该类是从扩展而来,而不是从扩展而来

因此,将转换器更新为类似以下内容应该可以做到:

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class OracleLocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate attribute) {
        return attribute == null ? null : Date.from(attribute.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    @Override
    public LocalDate convertToEntityAttribute(Date dbData) {
        return dbData == null ? null : dbData.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }
}
import java.time.LocalDate;
导入java.time.ZoneId;
导入java.util.Date;
导入javax.persistence.AttributeConverter;
导入javax.persistence.Converter;
@转换器(自动应用=真)
公共类OracleLocalDateAttributeConverter实现AttributeConverter{
@凌驾
public Date convertToDatabaseColumn(LocalDate属性){
返回属性==null?null:Date.from(attribute.atStartOfDay(ZoneId.systemDefault()).toInstant());
}
@凌驾
公共LocalDate convertToEntityAttribute(日期数据库数据){
返回dbData==null?null:dbData.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
}