型のクラスにプロパティ フィールドがありますjavax.xml.datatype.Duration
。これは基本的に時間範囲を表します (例: 4 時間 34 分)。
JPAは、それが無効なタイプであると言っていますが、私にはショックではありません。
これは良い解決策は何ですか?独自の Duration クラスを実装できましたが、JPA にそれをデータ型として「受け入れる」ようにさせる方法がわかりません。
型のクラスにプロパティ フィールドがありますjavax.xml.datatype.Duration
。これは基本的に時間範囲を表します (例: 4 時間 34 分)。
JPAは、それが無効なタイプであると言っていますが、私にはショックではありません。
これは良い解決策は何ですか?独自の Duration クラスを実装できましたが、JPA にそれをデータ型として「受け入れる」ようにさせる方法がわかりません。
これは良い解決策は何ですか?独自のDurationクラスを実装することはできますが、JPAにデータ型として「受け入れる」方法がわかりません。
JPAはカスタムタイプをサポートしていないため、この方法を使用する場合は、プロバイダーのJPA拡張機能を使用する必要があります。たとえば、Hibernateでは、で宣言するカスタム値型@Type
を定義できます。明らかに、これは懸念事項となる可能性のあるプロバイダー間の移植性を損なうことになります。そうでなければ、あなたはそれが実行可能であることを知っています。
標準のJPAでは、従来のアプローチは、問題のあるプロパティを適応させ、アクセス時に変換を実行する別のゲッター/セッターペアを追加することでした。Long
期間を保存するためにを使用します:
public MyEntity implements Serializable {
private Long id;
private javax.xml.datatype.Duration duration;
@Id
@GeneratedValue
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Transient
public Duration getDuration() {
return this.duration;
}
public void setDuration(Duration duration) {
this.duration = duration;
}
public Long getDurationAsJpaCompatibleType() {
return MyXmlUtil.convertDurationToLong(this.duration);
}
public void setDurationAsJpaCompatibleType(Long duration) {
setDuration(MyXmlUtil.convertLongToDuration(duration));
}
}
Duration クラスの正確なフィールドを独自のカスタム クラスにミラーリングすることはできますが、それはやり過ぎかもしれません...そのような期間の柔軟性/粒度は必要ないと思います。
したがって、必要なフィールドを選択してクラスに追加し、クラスに @Embeddable アノテーションを付けて、適切な JPA アノテーションをフィールドに追加します (これは単純な int であると想定しています)。
期間を格納するエンティティで、 @Embedded アノテーションをフィールドまたは getter のどちらか通常使用するものに追加します。ここから、@AttributeOverride を使用して列の定義をさらに微調整できます。
joda-time hibernateを試すことができます。永続化できる使用可能なタイプを参照してください。次に、次の方法でjoda Durationを使用できます。
@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;