javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional
我不明白注释javax.transaction.Transactional
和org.springframework.transaction.annotation.Transactional
之间的实际区别是什么?
org.springframework.transaction.annotation.Transactional
是javax.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]
- 在HQL中无关联地join
- 使用Spring和Hibernate跨多个数据库进行分布式事务的“最佳”方式是什么?
- 不能使用<union-subclass>(TABLE_PER_CLASS)标识列密钥生成
- 将Hibernate代理转换为真实的对象
- 有一个getter时,Hibernate总是需要一个setter吗?
- 无法序列化HibernateProxy的对象原因
- 没有更多的数据从套接字错误读取
- hibernateexception:org.hibernate.AnnotationException:没有为实体指定标识符:com..domain.idea.MAE_MFEView
- 如何configurationSQL Server的hibernateconfiguration文件