2014-10-15 5 views
57

Non capisco qual è la differenza effettiva tra le annotazioni javax.transaction.Transactional e org.springframework.transaction.annotation.Transactional?javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional

Èun'estensione di javax.transaction.Transactional o hanno un significato completamente diverso? Quando dovrebbero essere usati ciascuno di essi? La primavera @Transactinal nel livello di servizio e javax in DAO?

Grazie per la risposta.

risposta

54

Spring ha definito la propria annotazione Transazionale per rendere transazionale i metodi del bean Spring, anni fa.

Java EE 7 ha finalmente fatto la stessa cosa e ora consente ai metodi del bean CDI di essere transazionali, oltre ai metodi EJB. Quindi, dal momento che Java EE 7, definisce anche la propria annotazione Transazionale (ovviamente non può riutilizzare quella di Primavera).

In un'applicazione Java EE 7, verrà utilizzata l'annotazione Java EE.

In un'applicazione Spring, verrà utilizzata l'annotazione Spring.

Il loro uso è lo stesso: informare il contenitore (Java EE o Spring) che un metodo è transazionale.

+4

Oltre a questo: al fine di governare l'universo, Spring ha anche aggiunto il supporto implicito per 'javax.transaction.Transactional 'in modo che ora si possa usare anche in applicazioni Spring senza alcuna azione aggiuntiva. IMO, ** questa è stata una decisione piuttosto negativa dal punto di vista del design **, perché per mia esperienza molti sviluppatori confondono inconciliamente questi due nel loro codice che porta a problemi in seguito. – Yura

+1

Inoltre, 'org.springframework.transaction.annotation.Transactional' offre più opzioni (come' readOnly', 'timeout') rispetto a' javax.transaction.Transactional' – pierrefevrier

+0

@yura, quali problemi hai osservato? –

17

fate attenzione, (questo problema è accaduto in Tomcat),

Se l'applicazione è un'applicazione web PRIMAVERA e si utilizza meccanismo di gestione che è @org.springframework.transaction.annotation.Transactional transazione di primavera, quindi non mescolarlo con javax.transaction. transazionale.

Questo è sempre utilizzato, @org.springframework.transaction.annotation.Transactional in un'applicazione a molla in modo coerente.

Altrimenti si può finire con questo errore,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed 

........ 

Caused by: java.sql.SQLException: Protocol violation: [0] 
+0

Nota: questa risposta è un caso speciale della mia risposta – Jidehem

28

Un'altra differenza è il modo in primavera gestisce le annotazioni @Transactional

  • org.springframework.transaction.annotation.Transactional è sempre preso in conto
  • javax.transaction.Transactional viene preso in considerazione solo quando EJB3 transazioni un presente. La presenza delle transazioni EJB3 viene eseguita controllando se la classe javax.ejb.TransactionAttribute è disponibile nel classpath (dalla versione 2.5.3 alla 3.2.5). Così si può finire con le annotazioni che non vengono prese in considerazione se solo javax.transaction.Transactional si trova nel classpath e non javax.ejb.TransactionAttribute. Questo può essere il caso se stai lavorando con Hibernate: hibernate-core (4.3.7.Final) dipende da jboss-transaction-api_1.2_spec (1.0.0.Final), che non fornisce javax.ejb.TransactionAttribute.
+3

Penso che questo non sia più un problema con Spring 4.2.0: [javax.transaction.Annotazione transazionale è anche supportato come un drop-in sostituzione dell'annotazione di Spring] (http://docs.spring.io/spring/docs/4.2.0.RELEASE/spring-framework-reference/html/transaction.html#transaction-declarative-annotations) –

+0

non sempre preso , se è su un metodo privato, ad esempio non verrà preso. – strash

Problemi correlati