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和DAO中的javax

谢谢回答。

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)一种方法是事务性的。

另一个区别是Spring如何处理@Transactional注解

  • org.springframework.transaction.annotation.Transactional总是被考虑在内
  • javax.transaction.Transactional仅在存在EJB3事务时才被考虑。 通过检查类path中是否存在类javax.ejb.TransactionAttribute (从版本2.5.3到版本3.2.5),可以完成EJB3事务的存在。 因此,如果只有javax.transaction.Transactional在您的类path中,而不是javax.ejb.TransactionAttribute那么您最终可能不会考虑注释。 如果你使用Hibernate的话,情况就是这样:hibernate-core(4.3.7.Final)依赖于jboss-transaction-api_1.2_spec(1.0.0.Final),它不提供javax.ejb.TransactionAttribute

请小心,(这个问题发生在tomcat),

如果您的应用程序是SPRING Web应用程序,并且您使用的是@org.springframework.transaction.annotation.Transactional Spring事务处理机制,则不要将其与javax.transaction.Transactional混合使用。

那就是始终在Spring应用程序中始终使用@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]