1

Spring-ws を Jaxb2Marshaller、PayloadRootAnnotationMethodEndpointMapping、および GenericMarshallingMethodEndpointAdapter と共に使用して、@Endpoint および @PayloadRoot アノテーションを介して Web サービスを構成しています。

プロジェクトの DAO を使用しようとすると、データベースからオブジェクトをロードできますが、遅延ロードする必要があるサービス内のプロパティにアクセスしようとするとすぐに、org.hibernate.LazyInitializationException が発生します - プロキシを初期化できませんでした -セッションなし。

私の spring-mvc Web アプリケーションでは、OpenSessionInViewInterceptor がセッションを処理します。Web サービス呼び出しごとに Hibernate セッションを自動的に作成するように Web サービス プロジェクトを構成するにはどうすればよいですか?

4

2 に答える 2

2

org.springframework.aop.framework.ProxyFactoryBean を、休止状態セッションが存在する必要があるスプリング コンテキスト内のオブジェクトにラップします。

この記事http://springtips.blogspot.com/2007/06/spring-and-hibernate.htmlは、その方法を示しています。

この方法でセッションを使用しているときに遅延ロードされたコレクションが原因で問題が発生した場合は、少なくとも 2 つの修正方法があります。

  • 利用可能な Hibernate セッションで実行されるコードで、コレクションに Hibernate.initialize() 呼び出しを追加します - http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Hibernate.html#initialize(java. lang.Object)
  • マッピングに lazy="false" を追加して、遅延のないコレクションを使用します。このオプションを使用する場合は注意してください。いくつかの不適切に配置された lazy="false" オプションを使用すると、簡単に hibernate にデータベース全体を強制的にロードさせることができます。
于 2009-01-21T22:41:19.947 に答える
0

そんな中、解決策を見つけました。このフォーラムのエントリはヒントを与えてくれました:

http://forum.springframework.org/showthread.php?t=50284

基本的に、@Transactional アノテーションを Web サービス実装クラスに追加しました。トリッキーな部分は、Spring に元のクラス (tx:annotation-driven によって作成されたプロキシではなく) を使用するように指示することでした。これは、次の構成を使用して実現しました。

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" >
    <property name="order" value="1" />
</bean>

<tx:annotation-driven mode="proxy" order="200" proxy-target-class="true" />

構成ステートメントの順序も重要なようです。

于 2009-01-27T09:21:56.663 に答える