JPAと期間タイプをマッピングする方法
-
26-09-2019 - |
質問
私はタイプjavax.xml.datatype.Duration
のあるクラスのプロパティフィールドを持っています。これは、基本的に(例えば、4時間34分)期間を表します。
JPAは私に言っている、それは私に衝撃を与えていない無効なタイプです。
をいただきました!良い解決策この?私は私自身の期間クラスを実装することができますが、私はデータ型としてそれを「受け入れる」にJPAを取得する方法を知りません。
解決
あなたはこの道を行くにしたい場合は、あなたのプロバイダからJPA拡張を使用する必要がありますので、をいただきました!良い解決策この?私は私自身の期間クラスを実装することができますが、私はデータ型としてそれを「受け入れる」にJPAを取得する方法を知りません。
JPAは、カスタムタイプをサポートしていません。例えば、Hibernateはを定義することができカスタム値型を使用すると、 @Type
と宣言することををA>。明らかに、これが問題になることがありますプロバイダ間の移植性を害するます。ない場合は、それはなんとかです知っています。
は、標準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));
}
}
他のヒント
あなたは、独自のカスタムクラスに期間クラスの正確なフィールドを反映することができますが、それはやり過ぎかもしれない...私はあなたが期間の柔軟性/粒度のようなものを必要としないと仮定しています。
だから、(私は、単純なint型になりますと仮定している)フィールドに適切なJPAのアノテーションを@Embeddableのアノテーションを持つクラスをマークし、あなたのクラスに追加し、必要なフィールドを選択し、追加します。
あなたが通常使用する方のフィールドまたはゲッターに@Embedded注釈を追加し、期間を格納するエンティティは、。ここからはさらに@AttributeOverrideと列の定義を微調整することができます。
あなたはジョダ時間の休止を試みることができます。 使用可能なタイプを参照してくださいには、それが持続することができますを。その後、以下にジョダ期間を使用することができます道ます:
@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;