仕事に行け@Transactional
ない。私は持っていapplicationContext.xml
ます:
<bean
id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property
name="sessionFactory"
ref="sessionFactory" />
<property
name="dataSource"
ref="dataSource">
</property>
</bean>
上記のトランザクション マネージャーはどこにも注入されません。
私はspring-servlet.xmlに持っています:
<!-- Allows transaction to be demarcated using @Transactional within classes.-->
<tx:annotation-driven
mode="proxy"
proxy-target-class="true" />
DIがほとんどないファサードBeanがあります
<!-- Bean for getting a handle onto the DAO's for accessing the database. -->
<bean id="evoDaoFacade" class="com.xxx.yyy.zzz.discovery.hibernate.EvoTAMDAOFacade">
...
<property name="topoObjectDao" ref="topoObjectDao"></property>
<property name="sessionFactory" ref="sessionFactory"></property>
私のコードでは、上記のファサードを非スプリングのインスタンス化されたクラスに取得します。spring-servlet.xml
<bean
id="ApplicationContextProvider"
class="com.xxx.yyy.zzz.config.ApplicationContextProvider">
</bean>
コードで:
EvoTAMDAOFacade evoDao = (EvoTAMDAOFacade) ApplicationContextProvider.getBean("evoDaoFacade");
しかし、次の方法でファサードからアクセスできるDAoを使用する場合:
TopoObject topoobj = evoDao.getTopoObjectDao().findById(topoId);
ここで、findById は次のとおりです。
@Transactional
public TopoObject findById( TopoObjectId id) {
log.debug("getting TopoObject instance with id: " + id);
try {
TopoObject instance = (TopoObject) sessionFactory.getCurrentSession()
.get("com.xxx.yyy.zzz.discovery.hibernate.TopoObject", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here という休止状態の例外が発生します
@transactional
私の使い方の何が問題になっていますか?