4

型のクラスにプロパティ フィールドがありますjavax.xml.datatype.Duration。これは基本的に時間範囲を表します (例: 4 時間 34 分)。

JPAは、それが無効なタイプであると言っていますが、私にはショックではありません。

これは良い解決策は何ですか?独自の Duration クラスを実装できましたが、JPA にそれをデータ型として「受け入れる」ようにさせる方法がわかりません。

4

3 に答える 3

7

これは良い解決策は何ですか?独自の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));
    }
}
于 2010-05-14T14:16:18.983 に答える
1

Duration クラスの正確なフィールドを独自のカスタム クラスにミラーリングすることはできますが、それはやり過ぎかもしれません...そのような期間の柔軟性/粒度は必要ないと思います。

したがって、必要なフィールドを選択してクラスに追加し、クラスに @Embeddable アノテーションを付けて、適切な JPA アノテーションをフィールドに追加します (これは単純な int であると想定しています)。

期間を格納するエンティティで、 @Embedded アノテーションをフィールドまたは getter のどちらか通常使用するものに追加します。ここから、@AttributeOverride を使用して列の定義をさらに微調整できます。

于 2010-05-13T20:44:32.903 に答える
1

joda-time hibernateを試すことができます。永続化できる使用可能なタイプを参照してください。次に、次の方法でjoda Durationを使用できます。

@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;
于 2010-09-01T14:16:07.270 に答える