2つのトランザクションマネージャ(READ要求用とREAD-WRITE要求用)と2つのセッションファクトリを作成しました。次のように複数のトランザクションマネージャを使用している間、スレッドにHibernateセッションがバインドされていません
重要なスニペットは、次のとおりです。
<tx:annotation-driven />
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
<bean id="txManagerRead"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory" />
<qualifier value="READ"/>
</bean>
<bean id="txManagerWrite"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory1" />
<qualifier value="WRITE"/>
</bean>
<bean id="AbstractSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
abstract="true">
<property name="annotatedClasses">
<list>
.....
....
</list>
</property>
<property name="exposeTransactionAwareSessionFactory">
<value>true</value>
</property>
</bean>
<bean id="SessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
parent="AbstractSessionFactory">
<property name="hibernateProperties">
<props>
.........
.........
</props>
</property>
</bean>
<bean id="SessionFactory1"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
parent="AbstractSessionFactory">
<property name="hibernateProperties">
<props>
.........
.........
</props>
</property>
</bean>
私は例外次取得しています:以下のようにDAOがある呼び出す
Caused by: org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574)
at com.amazon.im.dao.hibernate.GenericDAOImpl.getSession(GenericDAOImpl.java:53)
at com.amazon.im.dao.hibernate.CategoryDAOImpl.findAllActiveCategories(CategoryDAOImpl.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
方法:
@Transactional(rollbackFor = { DependencyException.class, ServiceException.class }, readOnly = true, value="READ")
@Operation("getActiveCategories")
public GetActiveCategoriesResponse getActiveCategories() throws ServiceException, DependencyException
{ .....
......
......
}
誰がために私を指すことができます私は間違っていますか?
私は完全にこれを行うためのポイントを見ることができませんか?なぜ2つ(そして3つ)の異なるTMがあるのですか?読み書きメソッドが読み込みメソッドを呼び出す場合はどうなりますか? –
@JB:今のところ、読み書きメソッドは書き込みメソッドだけを呼び出すと仮定します。 2つのTM(3つ目はデフォルトのもの)を持つ理由は、開始時にセッションを作成するAPIごとにTransactionalアノテーションが存在することです。これは後続のDAO呼び出しで使用されます。 – instanceOfObject
私はそれを理解しています。しかし、不必要な複雑さを除いて、すべての操作に使用される1つの単一のTMで何を得るのですか?標準的な方法はTMを1つ持つことです。いくつかの必要はありません。 –