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
в служебном слое и javax в DAO?
Спасибо, что ответили.
Ответы
Ответ 1
Spring определил свою собственную аннотацию Transactional, чтобы сделать методы Spring bean транзакционными, много лет назад.
Java EE 7, наконец, сделала то же самое и теперь позволяет методам CDI bean быть транзакционными, в дополнение к EJB-методам. Так как Java EE 7, он также определяет свою собственную аннотацию Transactional (она, очевидно, не может повторно использовать Spring).
В приложении Java EE 7 вы будете использовать аннотацию Java EE.
В приложении Spring вы будете использовать аннотацию Spring.
Их использование одно и то же: информирование контейнера (Java EE или Spring) о том, что метод является транзакционным.
Ответ 2
Другое отличие состоит в том, как 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) зависит от jboss-transaction-api_1.2_spec (1.0.0.Final), который не предоставляет javax.ejb.TransactionAttribute
.
Ответ 3
Пожалуйста, будьте осторожны (эта проблема произошла в tomcat),
Если ваше приложение является веб-приложением SPRING, и вы используете механизм обработки транзакций SPRING, который @org.springframework.transaction.annotation.Transactional
, то не смешивайте его с javax.transaction.Transactional.
Это всегда используется @org.springframework.transaction.annotation.Transactional
в приложении SPRING.
В противном случае мы можем получить эту ошибку,
org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed
........
Caused by: java.sql.SQLException: Protocol violation: [0]