3

永続性のためにHibernateを使用しています。私のデータアクセス層では、シナリオに応じて、結果の一部を熱心にロードするように指定しています。

次に、これらの結果をJAXWS応答として送信する必要があります。

エンティティオブジェクトを取得してトラバースし、オブジェクトがWebサービスレイヤーに渡されたときにnull休止状態がスローされないように初期化されていないフィールドに設定する、よりクリーンなメソッドを使用できる方法はありますか?LazyInitializationException

または、この問題を解決するための代替手段はありますか。

4

4 に答える 4

2

エンティティをロードした後にアクティブセッションで実行できるHibernate#initialize()などがありますが、エンティティがHibernateの場合、渡したエンティティ(またはコレクション)のルートレベルでフィールド/参照を初期化しますプロキシー。JavaDocが述べているように:

注:これにより、プロキシオブジェクトまたはコレクションの初期化のみが保証されます。コレクション内の要素が初期化/マテリアライズされることは保証されていません。

初期化されていないフィールドにNULLを割り当てると、データの一貫性が失われるため、適切なアプローチではありません(誰かがこれらのフィールドにアクセスすると、実際の値を返すことが期待されます)。

于 2013-03-13T14:51:17.637 に答える
1

ここでも同じアーキテクチャを使用しており、ビジネスレイヤーでロードジョブを実行します。ws応答に必要なデータがわかっているだけなので、これを自動的に行う方法はありません。基本的に、エンティティモデル(JPAマッピング)を単純なPOJOに、またはその逆に変換するメソッドがあります。このメソッドでは、ロードに必要な属性を解決します。

次のようなものを使用できます。

public interface IBusiness<Model, VO> {

    public Model toModel(VO vo);
    public VO toVO(Model model);
    public List<Model> toModelList(List<VO> vos);
    public List<VO> toVOList(List<Model> models);

}

このインターフェイスをビジネスレイヤーに実装し、このメソッドで必要なすべてのものをロードするという怠惰な問題を解決します。

頑張って=)

于 2013-03-13T14:44:03.647 に答える
1

Springを使用している場合は、OpenSessionInView(Interceptor | Filter)を使用できます。セッションの境界をリクエストの境界に合わせるため、遅延初期化の例外を簡単に修正できます。プロキシされるデータに対してデータベースに対して追加のクエリを実行することでエラーを取り除くため、私は一般的にこのアプローチが好きではありません。

あなたのような場合の私の好みは、各呼び出しに関心のある特定のフィールドを持つ転送オブジェクトを使用することです。不要なデータをやり取りしたり、さらに悪いことに、永続層の実際の状態を誤って表現したデータを送信したりする意味はありません。

実際にはさらに一歩進んで、セッション境界をそのままにして、DAOメソッドがエンティティではなく転送オブジェクトを返すことを確認します。エンティティは単なるPOJOであると人々はしばしば主張しますが、これは単なる作業です。しかし、実際には、あなたの質問が示すように、エンティティをPOJOとして処理しようとすると、データアクセス専用のレイヤーに属する暗黙的なデータアクセスが発生する可能性があります。

于 2013-03-13T15:04:43.860 に答える
0

別の方法は、遅延初期化をまったく使用しないことです。

それを行う方法は、あなたが扱っているケースによって異なります。あなたがSOで見つける答え。

于 2013-03-13T14:42:35.207 に答える