3

Hibernate で @ManyToOne アソシエーションに Scala の Option のようなラッパー オブジェクトを使用する例はありますか?

ありがとう。

編集済み: 提案ありがとうございます。さらに考えた結果、プライベート変数を使用し、Option[MyType] を返すスカラ ゲッター/セッターを公開することにしました。このような:

class EmailFolder(__parent: Option[EmailFolder] = None) {

    //.... default constructor etc...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private[this] var _parent: EmailFolder = __parent.orNull
    def parent = Option(_parent)
    def parent_=(newVal:Option[EmailFolder]) = _parent = newVal.orNull
}

これは機能し、アプリケーションで null を扱う必要がなくなりました。

-- アンドレアス

4

1 に答える 1

1

ここで私が最初に考えたのは、クラスを作成し、それを と呼びOption、それを としてマークし@Embeddable、参照したいオブジェクトのセットの共通の基本クラスへの参照を与えることでした (それを と呼びますDomainObject)。

ただし、これを行うと、いくつかのことをあきらめる必要がある場合があります。

  1. @ManyToOne"...任意のオブジェクト..." Hibernate では、完全に任意のクラスへの参照を持つことはできません。特定の Hibernate Entity または Entity 階層である必要があります。つまり、DomainObjectそうでない場合、Hibernate はフェッチ時にどのテーブルを照会するかを知る方法がありません。
  2. "...null 値..." Hibernate は Elements (別名@Embeddable) に対していくつかの特別なことを行います。特に、Element に null 参照のみが含まれている場合、Element 自体への参照は null です。

したがって、そのアプローチを取ることもできますが、必要のない基本クラスと、単に Element 自体が null でないことを確認するための Element クラスの余分なフィールドになってしまいます。少し痛い。

代わりに、Option クラスを Hibernate から完全に除外することをお勧めします。オプションを持つエンティティでは、アクセス タイプの設定を使用して、Hibernate がメソッドではなくフィールドを介してメンバーにアクセスするようにします。次のようにゲッターを実装します。

...
@ManyToOne
private MyObjectType myObjectReference;

public Option<MyObjectType> getMyObject() {
    return new Option(this.myObjectReference);
}
...

もう 1 つのオプションは、フィールド レベルのアクセスを行うのではなく、Hibernate がフィールドを処理するための内部のプライベート ゲッター/セッターと、アプリケーションの残りの部分が参照できるようにそれを Option にラップするパブリック ゲッター/セッターを使用することです。

ここでの唯一の短所は、ゲッターが単純な POJO メソッドであるのではなく、実際の作業を行う必要があることです。しかし、Hibernate を結び目でひねらないことには価値があると思います。

それが役立つことを願っています。

于 2012-04-16T03:47:01.660 に答える