2

注釈ベースのトランザクション管理は初めてです。spring 3.1、Hibernate 3.2 で Web アプリケーションを開発しています。@Transactional に問題があります。以下のように子のセットを持つ POJO をロードします: 親クラスは DealerMember のセットを持つ DealerMaster なので、次のように宣言します。

ディーラーマスターで:

@OneToMany(fetch = FetchType.LAZY,mappedBy = "dealerMaster")
    @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN})
    public Set<DealerMember> getDealerMembers() {
        return this.dealerMembers;
    } 

HibernateUtil クラスを使用して任意のクエリを実行しているため、load メソッドを使用しています。

public static Object loadObject(Session paramSession, Object paramObject)
    throws Exception
  {
    try
    {       
      paramObject = paramSession.load(paramObject.getClass(), getId(paramObject));
    }
    catch (HibernateException localHibernateException)
    {
      setErrorMessage(paramObject, localHibernateException.getMessage());
      localHibernateException.printStackTrace();
    }

今、私の問題はロードメソッドが正常に実行されることですが、paramObject でコースを移動すると次のように表示されます。

com.sun.jdi.InvocationException occurred invoking method.

すべての値は、エラーをスローするコントローラー側でアクセスしようとした場合にのみ、サービスレイヤーでアクセスできます:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lbt.model.DealerMaster.dealerMember, no session or session was closed

同じ問題をグーグルで調べたところ、これは遅延読み込みに関連していることがわかりましたが、lazy = false としても fetchType.Eager を試しましたが、同じ問題でした。

4

1 に答える 1

0

LazyInitialzation 例外について 1 つのことを理解しておく必要があります。これは、hibernate がレイジー フェッチに設定されたオブジェクトを初期化できない場合に発生し、レイジー フェッチに設定された他のオブジェクトのセットを含むオブジェクトでセッションが閉じられたときに発生します。

フェッチを EAGER に設定すると機能しますが、関連するオブジェクトの階層がある場合、機能しない場合があります。例: ユーザー --> 役割のセットと役割を含む ---> 権限のセットを含む。すべてが遅延フェッチの場合は今。ユーザーオブジェクトを取得してセッションを閉じてから、そこからロールを取得しようとすると、例外が発生します。ユーザー POJO でロールにフェッチ熱心に設定しても、ロール POJO には遅延フェッチのアクセス許可が含まれているため、例外が発生します。

したがって、階層内のすべてを EAGER に設定します (パフォーマンスの問題がありますが、動作します)。または、オブジェクトの作業が終了したらセッションを閉じます (遅延フェッチを維持します)。

物事はうまくいくでしょう:)

于 2012-12-18T13:35:08.947 に答える