2017-04-18 2 views
1

Ich habe einen Konverter so, dass, wenn ich DATE Felder aus der Datenbank gelesen, sollte es in der Lage sein, sie zu java.time.LocalDate Objekte zu zwingen. Allerdings, wenn ich versuche, dies zu tun, es gibt mir diese Fehlermeldung:JPA-Konverter von DATE zu java.time.LocalDate nicht in 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 ist meine Tabelle, die eine Spalte hat START_DATE die vom Typ ist DATE. Hier ist der Konverter:

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

Warum denkt es, dass meine Spalte ein Zeitstempel ist? Werden alle Daten in Orakel zu java.sql.Timestamp gezwungen?

Antwort

1

Die Klasse java.sql.Timestamp ist diejenige, die der Persistenzanbieter verwendet, um ein Datum aus der DB zu analysieren, unabhängig davon, ob der Wert nur ein Datum ist. Es macht Sinn, weil es dem Persistenzanbieter ermöglicht, den Zeitteil eines DATETIME oder TIMESTAMP zu erhalten. Beachten Sie, dass sich diese Klasse von java.util.Datenichtjava.sql.Date erstreckt.

So sollte Ihr Konverter so etwas wie diese Aktualisierung der Trick:

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