注釈javax.transaction.Transactional
とorg.springframework.transaction.annotation.Transactional
の実際の違いはわかりませんか?
org.springframework.transaction.annotation.Transactional
はjavax.transaction.Transactional
の拡張ですか、それともまったく異なる意味を持っていますか?それぞれをいつ使用する必要がありますか? Spring @Transactinal
サービス層でjavax DAOで?
回答ありがとうございます。
Springは、独自のTransactionalアノテーションを定義して、Spring Beanメソッドをトランザクション対応にするようになりました(数年前)。
Java EE 7ではようやく同じことが行われ、EJBメソッドに加えて、CDI Beanメソッドがトランザクション対応になりました。 Java EE 7以降、独自のTransactionalアノテーションも定義しています(明らかにSpringアノテーションを再利用することはできません)。
Java EE 7アプリケーションでは、Java EEアノテーションを使用します。
Springアプリケーションでは、Springアノテーションを使用します。
それらの使用方法は同じです。コンテナ(Java EEまたはSpring)にメソッドがトランザクションであることを通知します。
もう1つの違いは、Springが@Transactionalアノテーションを処理する方法です
javax.ejb.TransactionAttribute
がクラスパス(バージョン2.5.3から3.2.5まで)で利用可能かどうかをチェックすることにより行われます。したがって、javax.transaction.Transactional
だけではなくjavax.ejb.TransactionAttribute
だけがクラスパスにある場合、注釈が考慮されないことになります。これは、Hibernateを使用している場合に当てはまります。hibernate-core(4.3.7.Final)は、javax.ejb.TransactionAttribute
を提供しないjboss-transaction-api_1.2_spec(1.0.0.Final)に依存しています。注意してください(この問題はTomcatで発生しました)。
アプリケーションがSPRING Webアプリケーションであり、@org.springframework.transaction.annotation.Transactional
であるSpringのトランザクション処理メカニズムを使用している場合、javax.transaction.Transactionalと混合しないでください。
これは常に使用されます。@org.springframework.transaction.annotation.Transactional
は、春のアプリケーションで一貫して使用されます。
そうしないと、このエラーが発生する可能性があります。
org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed
........
Caused by: Java.sql.SQLException: Protocol violation: [0]