2016-03-23 12 views
0

私はAccountController、AccountManager、AccountDaoの3つのクラスを持っています(コントローラ< - マネージャ< - daoの順番で互いに注入されています)。 accountDaoに@Transactionalアノテーションを置くと、DBセッションがあり、すべて正常に動作します。 @Transactionalをマネージャに置くと、動作しません。私は得る:@トランザクションの注釈は私のクラスを代理しません

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 

私はaccountManagerが(何らかの理由で)プロキシを持つラッパーではないことがわかります(デバッグ時)。これがどうして起こるのか?私は自分のアプリケーションコンテキストのXMLで

:AccountManagerをオン

<context:component-scan base-package="com.mypackage" use-default-filters="true"> 
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
</context:component-scan> 
<tx:annotation-driven transaction-manager="hibernateTransactionManager" proxy-target-class="true"/> 

私は、次の注釈入れる:

@Repository 
@Transactional 
public class AccountManager { ... } 

をとにも奇妙なことがあり、AccountManagerをは「デバイス・マネージャ」は、それに注入しましたAccountManagerと同じ注釈が付いていますが、DeviceManagerはプロキシされています!それは完全にトランザクションです。

私はorg.springframework.transaction.annotation.Transactionalアノテーションを使用しています。

私は私はあなたがJTA @Transactional注釈が必要だと思うのAccountManager

+0

暗いところで撮影 - 同じ '@ Transactional'を使用していますか?あなたは偶然に別のものを輸入しなかったのですか? – BretC

+0

は、 'hibernateTransactionManager' Bean定義を示してくれますし、' AccountManager'はいつでも 'final'メソッドを持っていますか? –

+0

私はAccountDao(org.springframework.transaction.annotation.Transactional)で使用したのと同じ@Transactionalアノテーションを使用しています。 – Nir

答えて

1

における最終的なメソッドを持っていません。 RepositoryクラスAccountManagerのHibernateのorg.springframework.transaction.annotation.Transactionalの代わりにjavax.transaction.Transactionalを使用してください。

春のドキュメントSpring Transactional Annotation

+1

私の他のクラスがプロキシされていなければ、私はあなたに同意するでしょう。しかし、もう一度、AccountDaoは@Transactionalを追加するとうまく動作します – Nir

関連する問題