Подтвердить что ты не робот

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?

Спасибо, что ответили.

4b9b3361

Ответ 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]