Spring 3.0.x での処理方法をより反映するように、古い Spring プロジェクトを作り直しています。
私が行った変更の 1 つは、リポジトリ/dao レイヤーに対するものでした。ベスト プラクティスでアドバイスされているように、私は からHibernateDaoSupport
を使用するように拡張するのではなく、Spring 3.0.x 以降で動作するはずの をHibernateTemplate
使用して HibernateSessionFactory
を直接使用します。sessionFactory.getCurrentSession()
これはプロジェクト全体にとって非常に大きな恩恵であり、HibernateTemplate
. onStartUp
ただし、 @PostConstruct を使用していた (またはXML アプリケーションコンテキストでBean の属性を使用していた) Service メソッドを呼び出すことができなくなったことに気付きました。
たとえば、このメソッドは以前は を使用して問題なく動作してHibernateTemplate
いましたが、現在、Hibernate はスレッドにバインドされたセッションがないことを訴える例外をスローします。
@Override
@PostConstruct
public void onStartUp() {
logger.debug("Starting Bootstrap Service...");
createSysAdminUser();
createDefaultRoles();
createDefaultThemes();
createStopListIfDoesNotExist();
stopListService.load();
partialMappingService.load();
dictionaryService.load();
}
このメソッド呼び出しを削除することもでき@PostConstruct
ます... システムで唯一のものです。アプリケーションが新しいアプリケーションのデータをブートストラップするために起動するときに呼び出されます。ほとんどの場合、本番システムでは何もしませんが、新たに作成されたテストおよび開発用データベースに使用すると便利です。
なぜ、どのように修正できるかについてのアイデアはありますか?
ありがとう!
編集:これが私のトランザクション管理アドバイス構成です:
<aop:config>
<aop:advisor advice-ref="transactionAdvice"
pointcut="execution(* *..service.*.*(..))" order="1"/>
<!-- gets sub packages like service.user -->
<aop:advisor advice-ref="transactionAdvice"
pointcut="execution(* *..service.*.*.*(..))" order="2"/>
</aop:config>
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>