2017-03-28 2 views
14

例えば、YearMonthYearMonthが欠落しているhibernate-java8などInstantLocalDate、のようなクラスのカップルのためのアダプタを提供するJARが、java.timeからいくつかのクラスがあります。これらのクラスは、不明確な無駄なものであるSerializableのように格納されます。Hibernateはシリアライズjava.time.yearなど

確かに私はYear yearの代わりにint yearを使用することができましたが、私はそれは良い考えです。

YearJavaDescriptorの書き込みはかなり簡単ですが、なぜそれが欠落しているのだろうかと思います。特にYearMonthの場合は、既存のアダプターを強くお勧めします。 何か愚かなことをしていますか?

グーグルリングが何も返さないのでわかりません。

+1

を: http://stackoverflow.com/questions/40825495/java-time-yearmonth-as-a-type -within-entity – LLL

+1

'YearMonth'のような型をシリアライズ/エンコードする際のアドバイス。 [あなたのデータベース統計を考える](https://blog.jooq.org/2016/10/05/why-you-should-design-your-database-to-optimise-for-statistics/)、おそらく人間が読める形式で、よりよい最適化形式を採用しています。 –

+0

@ LukasEderありがとう、私はあなたのblogpostを読んだ。 IIUICでは、「2017-03」や「201703」の代わりに「2000年以降の月」や「日付( '2017-03-01')」や「201703」のような情報を推奨します。データベースには 'toString' /' fromString'でカスタム型がないので、読みやすさと速度の両方を持つことができます。 – maaartinus

答えて

4

JPAプロバイダが適切な方法で型を保持していない場合(この場合、JPA 2.1が承認された後に追加されたJava8クラスであるため)、JPA 2.1 AttributeConverterを定義してそれを標準のJPA永続型(この場合はjava.sql.Dateのようなもの)です。

+0

これはJava 8ですが、私はhibernate-java8 JARを使用しています。 – maaartinus

8

この目的のためにコンバータを作成しようとしてください - AttributeConverter

私は次のように過去のものに使用さ

:私はこれがあなたの問題の答えだと思う

@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()); 
    } 
} 
関連する問題