2017-04-18 7 views
1

DATEフィールドをデータベースから読み取ったときに、java.time.LocalDateオブジェクトに変換するような変換を行いました。私はそうしようとすると、しかし、それは私に、このエラーを与える:DATEからjava.time.LocalDateへのJPAコンバータはGlassfish 4.1には適用されていません

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タイプDATEである列START_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になりますか?

答えて

1

クラスjava.sql.Timestampは、値が単なる日付であるにもかかわらず、永続性プロバイダがDBから日付を解析するために使用するものです。これは、永続性プロバイダがDATETIMEまたはTIMESTAMPの時間部分を取得できるため、意味があります。このクラスはjava.util.Dateではなく、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(); 
    } 
} 
関連する問題