【问题标题】:JPA converter from DATE to java.time.LocalDate not applying in Glassfish 4.1从 DATE 到 java.time.LocalDate 的 JPA 转换器不适用于 Glassfish 4.1
【发布时间】:2017-09-14 23:16:02
【问题描述】:

我制作了一个转换器,当我从数据库中读取 DATE 字段时,它应该能够将它们强制转换为 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_TABLE 是我的表,其中有一列START_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);
    }
}

为什么它认为我的列是时间戳? oracle 中的所有日期都被强制转换为java.sql.Timestamp 吗?

【问题讨论】:

    标签: java oracle jpa glassfish eclipselink


    【解决方案1】:

    java.sql.Timestamp 类是持久性提供程序用来从数据库中解析日期的类,而不管值只是一个日期。这是有道理的,因为它允许持久性提供程序获取 DATETIME 或 TIMESTAMP 的时间部分。请注意,此类扩展自 java.util.Date not java.sql.Date

    因此,将您的转换器更新为这样的东西应该可以解决问题:

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 2014-12-26
      • 2017-03-04
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2019-03-06
      • 1970-01-01
      相关资源
      最近更新 更多