1

私が抱えている問題は、Spring を使用して Web アプリケーションの休止状態を管理およびロードすることです。現在、OpenSessionInViewFilter を使用しています。これは、アプリケーションを表示しているときは意図したとおりに機能しますが、Quartz タスクや一部のタスクを支援するために作成した Runnable スレッドなど、ビューに関連しないアクティビティから hibernate にアクセスしようとすると、うまく機能しません。これにより、Lazy 初期化例外が発生し、セッションを使用できない例外が発生します。

現在Springを使用してHibernateを管理する方法は次のとおりです

<bean id="mainDataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    [..DB config..]
</bean>

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="dataSource">
        <ref bean="mainDataSource"/>
    </property>
</bean>

<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory"><ref local="sessionFactory"/></property>
    <property name="dataSource"><ref local="mainDataSource"/></property>
</bean>

次に、HibernateDaoSupport を拡張してサービス クラスに挿入する DAO オブジェクトを構成します。

<bean id="myDAO"
    class="package.myDAO">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

<bean id="mySvcTarget" class="package.myService">
    <property name="myDAO"><ref bean="myDAO"/></property>
</bean> 

<bean id="myService" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref bean="txManager"/>
    </property>

    <property name="target">
        <ref bean="mySvcTarget"/>
    </property>

    <property name="transactionAttributes">
        <props>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

次に、私のアプリケーションでは、myService がコントローラー クラスに挿入されるので、それを使用して DAO にアクセスします。私の状況では、サービスクラスはビューセッション中にのみ開いているように見えるため、他の方法でDAO(またはできればサービス)にアクセスし、手動で休止状態セッションを開いたり閉じたりする必要があるようです。これを行う最善の方法が正確にはわかりません。すべての休止状態の構成はSpringに既に存在するため、それは単なる問題であるか、何らかの方法でそれらを呼び出していると想定しています。

4

1 に答える 1

0

まず、使用している (ビュー以外の) 追加サービスは、Spring によって表示される必要があります。これを行う最も簡単な方法は、@Service アノテーションを使用することです。そして、それを機能させるために、構成に追加でき<context:component-scan base-package="your.package">ます。

この後、Spring がサービスを Bean と見なす場合は、 @Transactional アノテーションを使用して Hibernate セッションを含めるだけで十分です。

于 2014-08-02T04:32:39.380 に答える