web-dev-qa-db-ja.com

javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional

注釈javax.transaction.Transactionalorg.springframework.transaction.annotation.Transactionalの実際の違いはわかりませんか?

org.springframework.transaction.annotation.Transactionaljavax.transaction.Transactionalの拡張ですか、それともまったく異なる意味を持っていますか?それぞれをいつ使用する必要がありますか? Spring @Transactinalサービス層でjavax DAOで?

回答ありがとうございます。

104
stamis

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)にメソッドがトランザクションであることを通知します。

88
JB Nizet

もう1つの違いは、Springが@Transactionalアノテーションを処理する方法です

  • org.springframework.transaction.annotation.Transactionalは常に考慮されます
  • javax.transaction.Transactionalは、EJB3トランザクションが存在する場合にのみ考慮されます。 EJB3トランザクションの存在は、クラス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)に依存しています。
41
Jidehem

注意してください(この問題は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]
28
Lyju I Edwinson