2017-03-28 42 views
14

Jest hibernate-java8 JAR dostarczenie kart do kilku klas, jak InstantLocalDate itp, ale niektóre klasy z java.time np Year, Month, YearMonth brakuje. Klasy te są przechowywane jako nieznane Serializable, co jest niepotrzebnie marnotrawstwem.hibernacji serializacji java.time.year i inni

Z pewnością mógłbym użyć int year zamiast Year year, ale nie sądzę, że to dobry pomysł.

Wygląda na to, że pisanie YearJavaDescriptor powinno być łatwe, ale zastanawiam się, dlaczego go brakuje. Szczególnie w przypadku YearMonth, zdecydowanie wolałbym istniejący adapter, czy istnieje? Czy robię coś głupiego?

Nie jestem pewien, jak google nie zwraca nic.

+1

myślę, że odpowiedzi na swoje problemy: http://stackoverflow.com/questions/40825495/java-time-yearmonth-as-a-type -within-entity – LLL

+1

Jedna rada podczas szeregowania/kodowania typu takiego jak "YearMonth". [Pomyśl o statystykach baz danych] (https://blog.jooq.org/2016/10/05/why-you-dis-design-your-database-to-optimise- for-statistics/), a być może unikaj czytelny dla człowieka format na rzecz łatwiejszego do optymalizacji. –

+0

@LukasEder Dziękuję, przeczytałem twój blog. IIUIC, poleciłbyś coś takiego jak 'miesiące od 2000' lub' DATA ('2017-03-01') 'zamiast' '2017-03'' lub' 201703', aby statystyki działały lepiej. Szkoda, że ​​bazy danych nie mają niestandardowych typów z 'toString' /' fromString', więc możemy mieć zarówno czytelność, jak i szybkość. – maaartinus

Odpowiedz

4

Jeśli dostawca JPA nie utrzymuje typu w sensowny sposób (w tym przypadku ponieważ jest to klasa Java8, która została dodana po zatwierdzeniu JPA 2.1), musisz zdefiniować JPA 2.1 AttributeConverter, aby przekonwertować go na standardowy typ trwałości JPA (w tym przypadku coś jak java.sql.Date).

+0

To java 8, ale używam hibernacji java8 JAR. – maaartinus

8

Spróbuj utworzyć konwerter - AttributeConverter implementację do tego celu.

Kiedyś w przeszłości coś jak następuje:

@Entity 
public class RealEstateAgency { 
    @Column(name = "createdAt") 
    @Convert(converter = ZonedDateTimeConverter.class) 
    private ZonedDateTime creationDate; 
} 

@Converter(autoApply = true) 
public class ZonedDateTimeConverter implements AttributeConverter<ZonedDateTime, Date> { 
  
    public Date convertToDatabaseColumn(ZonedDateTime toConvert) { 
     return toConvert == null ? null : Date.from(toConvert.toInstant()); 
    } 
  
    public ZonedDateTime convertToEntityAttribute(Date toConvert) { 
     return toConvert == null ? null : ZonedDateTime.from(toConvert 
       .toInstant()); 
    } 
}