2017-03-28 20 views
14

örneğin Year, Month, YearMonth eksik hibernate-java8 vb Instant, LocalDate gibi sınıfların birkaç adaptörler sağlayan JAR, ancak java.time bazı sınıfları var. Bu sınıflar, gereksiz bir şekilde savurgan olan, bilinmeyen bir Serializable gibi depolanır.hazırda seri java.time.year ve diğerleri

Şüphesiz Year year yerine int year kullanabilirim, ama bence, bu iyi bir fikir.

YearJavaDescriptor'u yazmak oldukça kolay olmalı, ancak neden eksik olduğunu merak ediyorum. Özellikle YearMonth durumunda, mevcut bir adaptör kullanmayı çok isterim. Yoksa aptalca bir şey yapıyorum?

Şu anda googling hiçbir şey döndürmediğinden emin değilim.

+1

bu sorunu yanıtlıyor:

aşağıdaki gibi geçmiş bir şey olarak kullanılan http://stackoverflow.com/questions/40825495/java-time-yearmonth-as-a-type -within-varlık – LLL

+1

"YearMonth" gibi bir tür dizileştirme/kodlama yaparken bir parça tavsiye. [Veri tabanı istatistiklerinizi düşünün] (https://blog.jooq.org/2016/10/05/why-you-should-design-your-database-to-optimise-for-statistics/) ve belki de Daha iyi bir optimizasyon lehine insan tarafından okunabilir format. –

+0

@LukasEder Teşekkür ederim, blog sayfanızı okudum. IIUIC, istatistiklerin daha iyi çalışabilmesi için "2017-03" veya "201703" yerine "2000'den beri aylar gibi" veya "2017-03-01") gibi bir şey önermenizi öneririz. Veritabanlarının 'toString' /' fromString' ile hiçbir özel tipinin olmaması, bu yüzden hem okunabilirliğe hem de hıza sahip olabiliriz. – maaartinus

cevap

4

JPA sağlayıcınız mantıklı bir şekilde bir türü devam ettirmiyorsa (bu durumda, JPA 2.1 onaylandıktan sonra eklenen bir Java8 sınıfı olduğu için), JPA 2.1 AttributeConverter tanımlamak için bunu tanımlamanız gerekir. Standart bir JPA persistabl tipi (bu durumda java.sql.Date gibi bir şey).

+0

Java 8, ancak hibernate java8 JAR kullanıyorum. – maaartinus

8

Bu amaçla bir dönüştürücü - AttributeConverter uygulaması oluşturmaya çalışın.

bence
@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()); 
    } 
} 
İlgili konular