2011-12-31 10 views
1

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はプレゼンテーションレイヤーの前にトランザクションを閉じます)。

+0

あなたのサービスの@Transaction Annotationは考慮されていないと思います。 - メソッドを呼び出すメソッドと、トランザクションアノテーションのサポートを可能にする構成の一部を持つメソッドのほかに、トランスフォーメーションアノテーションを持つサービスメソッドの1つを投稿してください。 – Ralph

+0

@Ralph私は私の質問を延長しました。 – mmatloka

答えて

1

IMO、後でオンになっているのDAOのオブジェクトのこれらのフィールドを初期化する必要がありますプレゼンテーション層で必要とされる。

これらのオブジェクトを熱心に初期化するのがやや汚いと感じる場合は、サービスレイヤーによってマッピングされた新しいプレゼンテーションレイヤー固有のクラス(ビューモデル)を導入する必要があります(必要に応じて読み取りトランザクションをまだ開いています) 。

私はJavaのバックグラウンドを持っていないので、 "春のセキュリティ"がデータベースにアクセスする必要があるかどうかわかりません。そうであれば、既に分かっているように、対応するservicelayerにこれらのトランザクション属性を追加する必要があります。しかし、私はDAOメソッドの周りにトランザクショナルアトリビュートを置く必要があるとは考えていません。

+0

daoのこのフィールドを初期化することによってlaziliの初期化例外を解決することには、別の欠点もあります。私は、OpenSessionInViewFilterを使用して、セッションスコープをプレゼンテーションレイヤーに拡張することを検討しています。 – mmatloka

+0

例外をキャッチしてはいけませんが、サービスレイヤーからプレゼンテーションレイヤーに戻されたオブジェクトに、必要な、つまり初期化された値がすべて含まれていることを確認してください。 – tobsen

0

ません、エラーがJTAトランザクションマネージャを設定するには、あなたを語っている:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/jta/JtaTransactionManager.html

自分の状況に最も適したものを選択してください。

このHibernateのフォーラムの質問は、同様に適切であるかもしれない:

https://forum.hibernate.org/viewtopic.php?p=2430788

コントローラがはトランザクションではありません。あなたはそれらを正しい場所に持っています。彼らはサービスに属しています。

OpenSessionInViewはあなたの解決策になるかもしれません:

http://springtips.blogspot.com/2007/07/open-session-in-view.html

それともそうではないかもしれない:

Why is Hibernate Open Session in View considered a bad practice?

+0

私はatomikosのドキュメントで説明されているようにJTAトランザクションマネージャを設定しました。 – mmatloka

+0

クラス署名はSpringのJTAに準拠していますか?そうでない場合、どのように使用されますか?申し訳ありませんが、私はAtomikosに精通していません。 Hibernateフォーラムの質問をチェックしてください。セッションの問題について話しました。 – duffymo

+0

私は私の質問を延長しました。 – mmatloka

関連する問題