AtomikosとSpring 3.1でHibernate 3.6.9を使用しています。 Where does the @Transactional annotation belong?を読んだ後、私はすべてのDAOの@Transactionalアノテーションを削除しました。サービスの場合にのみ残しました。任意のDAOのDB操作でこれらの注釈を除去した後、私は受信DAOのトランザクション使用
org.hibernate.HibernateException: Unable to locate current JTA transaction
マイ設定:
<tx:annotation-driven transaction-manager="jtaTransactionManager" />
<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- when close is called, should we force transactions to terminate or
not? -->
<property name="forceShutdown" value="false" />
</bean>
<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
セッションファクトリー・プロパティー:
<prop key="hibernate.connection.isolation">3</prop>
<prop key="hibernate.current_session_context_class">jta</prop>
<prop key="hibernate.transaction.factory_class">com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory
</prop>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
</prop>
がどのように私はDAOのトランザクションを管理する必要があり、そしてどのように私ができますサービスの外でDAOを使用しますか?これを解決する唯一の方法は、daosを使用するどのレイヤーでも、手動でトランザクションを開始することです(propagation with propagation requires_new)?しかし、DAOとTransactionalを使用する場合、遅延初期化の例外(トランザクションはプレゼンテーションレイヤーの前に閉じられ、エンティティフィールドを初期化しようとします)で問題が発生しました。
編集:春のMVCのコントローラに直接DAOにアクセスすることができたときに
私はトランザクションを管理する必要がありますどのように?コントローラーはトランザクション処理する必要がありますか?
春のセキュリティはdao(@Transactionalなし)を使用するため、ログイン処理中にも問題が発生するため、レイヤーでトランザクションが開始されません。
@Transactionalを春のセキュリティで使用されるdaosは問題を解決します - > @Transactionalがすべて動作しますが、このアノテーションなしでdbを使用することはできません。しかし、いくつかのDAOに@Transactionalを追加すると、バネmvcが何らかのデータを表示したいときに怠惰な初期化例外が表示され、DAOの手動Hibernate.initializeだけが動作します(最後の@Transactionalはプレゼンテーションレイヤーの前にトランザクションを閉じます)。
あなたのサービスの@Transaction Annotationは考慮されていないと思います。 - メソッドを呼び出すメソッドと、トランザクションアノテーションのサポートを可能にする構成の一部を持つメソッドのほかに、トランスフォーメーションアノテーションを持つサービスメソッドの1つを投稿してください。 – Ralph
@Ralph私は私の質問を延長しました。 – mmatloka