2012-01-05 9 views
1

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 
{ ..... 
...... 
...... 
} 

誰がために私を指すことができます私は間違っていますか?

+0

私は完全にこれを行うためのポイントを見ることができませんか?なぜ2つ(そして3つ)の異なるTMがあるのですか?読み書きメソッドが読み込みメソッドを呼び出す場合はどうなりますか? –

+0

@JB:今のところ、読み書きメソッドは書き込みメソッドだけを呼び出すと仮定します。 2つのTM(3つ目はデフォルトのもの)を持つ理由は、開始時にセッションを作成するAPIごとにTransactionalアノテーションが存在することです。これは後続のDAO呼び出しで使用されます。 – instanceOfObject

+0

私はそれを理解しています。しかし、不必要な複雑さを除いて、すべての操作に使用される1つの単一のTMで何を得るのですか?標準的な方法はTMを1つ持つことです。いくつかの必要はありません。 –

答えて

2

thisとして@Transactional( "Tx_Manager_Name")を試してみてください。複数のTxnマネージャーが修飾子でもサポートされているため、設定が正しいと思われます。

+0

Aravindに感謝します。しかし、私はこのコードがあなたが言ったことを正確に行っていると思います。 @Transactional(rollbackFor = {DependencyException.class、ServiceException.class}、readOnly = true、value = "READ")。違いがある場合は教えてください。 「READ」はTX_MANAGERの名前です。 – instanceOfObject

+1

@tyro - 私はあなたの設定全体を複製しており、何の問題も見つかりませんでした。私はDao層に問題があるかもしれないと思う - セッション工場や何かの注入。あるいは、トランザクションの外でルックアップを実行しているかもしれません。 –

+0

はい。 ありがとうございました:) – instanceOfObject

2

設定が間違っています。 HibernateとSpringだけでは、アプリケーションごとに1つのセッションファクトリを作成することができます。このリンクを確認してください:Spring + Hibernate session lifecycle。トランザクションごとにセッションを作成できます。

また、このリンクをチェックしてください。http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/SessionFactory.html

+0

org.hibernate.HibernateException:No Hibernate Session:いいえ、休止状態にしました:がコメントされました。スレッドにバインドされていて、コンフィグレーションで非トランザクション型のもの(セッションファクトリー)を作成できない場合は、 –

+0

が正しいかどうかわかりません。私は複数のセッションファクトリを使用する複数のアプリケーションを構築しました。一つは 'dataSource'です。もちろん、Hibernateは同じSessionFactoryを再利用して新しいセッションを作成することができます(EhCacheが 'CacheManager'とキャッシュで行うようなもの)。 – atrain

+0

うん!それは可能です。複数のdataSourceを使用している場合は、dataSourceごとにsessionfactoryを作成できます。しかし、@tyroは2つの(読み書きする)sessionFactoriesに対して1つのdataSourceを使用していますが、これは不可能です。 –

関連する問題