3

Liferay ポータル サーバー用のポートレットを開発するために、Spring と Hibernate を併用しています。基本的に、A と B の 2 つのエンティティがあり、A には多くの B が含まれている可能性があります。したがって、これは 2 つの間の 1 対多のマッピングになります。

<set cascade="all" lazy="true" name="comments" order-by="creationDate desc">
   <key column="lfpn_pinboardentries_idPinboardEntry" not-null="true"/>
   <one-to-many class="Comment"/>
</set>

DAO 層のエンティティ A の対応する DAO では、Spring によって提供される「HibernateDaoSupport」から継承しているため、典型的なデータの取得は次のようになります。

...
public A getA(long id) {
  return (A) getHibernateTemplate().get(A.class, id);
}
...

「lazy=false」を使用している場合はすべて正常に機能しますが、「lazy=true」に切り替えるとすぐに次のエラーが表示されます。

org.hibernate.LazyInitializationException: ロールのコレクションの遅延初期化に失敗しました: com.lifepin.entities.PinboardEntry.comments、セッションまたはセッションが閉じられませんでした

何が問題なのか、または解決方法のヒントを提案してくれる人はいますか?

ありがとう!

4

4 に答える 4

3

通常、1つのリクエストでオブジェクトを読み込んだ後、遅延読み込みプロパティにアクセスせずにオブジェクトをセッションに保存した場合に、このエラーが発生します。その後、別のリクエストで遅延読み込みプロパティにアクセスしようとすると、この例外が発生します。

簡単に言えば、オブジェクトが最初にロードされたHibernateセッションが閉じられました。別のHibernateセッションでこのオブジェクトの遅延ロードされたプロパティにアクセスすると、この例外が発生します。

プロパティを遅延ロードできるようにするには、オブジェクトを現在のHibernateセッションにリロードする必要があります

于 2009-04-23T07:28:00.240 に答える
1

Hibernateの遅延読み込みと非常に役立つソリューション(プリロードパターンと呼ばれる)に関する優れたディスカッションは、http://entwickler-forum.de/showthread.php?t=47067にあります

残念ながら、これはドイツのWebサイトです。しかし、少なくともソースコードとそのドキュメントは英語です。

上記のWebサイトの中心的な考え方は、オブジェクトグラフ全体の読み込みを回避し(遅延読み込みを介して)、特定の状況でオブジェクトグラフのどの部分を読み込む必要があるかを明示的に指定する機会を与えることです。

于 2009-06-09T07:39:28.037 に答える
0

春のフレームワークで休止状態を使用するときに OpenSessionInViewFilter を使用する人もいます。

web.xml ファイルでフィルターを宣言する必要があると書かれています。

<filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

しかし、それは私の問題を解決しません。多分私は何か間違ったことをしています。

于 2009-06-09T07:26:26.783 に答える
0

これは、Hibernate セッションが getHibernateTemplate メソッドのどこかで閉じられているためです。lazy="true" の場合、seesion.open() と session.close() の間で関連付けをインスタンス化できます。lazy="false" が機能しているのは、Hibernate が A のロード中に関連する B オブジェクトを熱心にフェッチしているためです。

于 2009-05-15T18:28:53.157 に答える