Transactionele annotaties: lente versus JTA

Persistentie top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

In deze tutorial bespreken we de verschillen tussen org.springframework.transaction.annotation.Transactional en javax.transaction.Transactional annotaties.

We beginnen met een overzicht van hun configuratie-eigenschappen. Vervolgens bespreken we op welke soorten componenten elk kan worden toegepast en onder welke omstandigheden we de een of de ander kunnen gebruiken.

2. Configuratieverschillen

Lente Transactioneel annotatie wordt geleverd met extra configuratie in vergelijking met zijn JTA-tegenhanger:

  • Isolatie - Spring biedt isolatie op transactiebereik via de isolatie eigendom; in JTA is deze functie echter alleen beschikbaar op verbindingsniveau
  • Voortplanting - beschikbaar in beide bibliotheken, via het voortplanting onroerend goed in het voorjaar, en de waarde onroerend goed in Java EE; Lente aanbiedingen Genest als een extra voortplantingstype
  • Alleen-lezen - alleen beschikbaar in het voorjaar tot en met alleen lezen eigendom
  • Time-out - alleen beschikbaar in het voorjaar tot en met time-out eigendom
  • Rollback - beide annotaties bieden rollback-beheer; JTA biedt de rollbackOn en dontRollbackOn eigenschappen, terwijl de lente heeft rollback voor en noRollbackFor, plus twee extra eigenschappen: rollbackForClassName en noRollbackForClassName

2.1. Voorjaar Transactioneel Annotatieconfiguratie

Laten we als voorbeeld de Spring gebruiken en configureren Transactioneel annotatie bij een eenvoudige autoservice:

importeer org.springframework.transaction.annotation.Transactional; @Service @Transactional (isolatie = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS, readOnly = false, time-out = 30) openbare klasse CarService {@Autowired privé CarRepository carRepository; @Transactional (rollbackFor = IllegalArgumentException.class, noRollbackFor = EntityExistsException.class, rollbackForClassName = "IllegalArgumentException", noRollbackForClassName = "EntityExistsException") public Car save (Car car) {return carRepository.save (auto); }}

2.3. JTA Transactioneel Annotatieconfiguratie

Laten we hetzelfde doen voor een eenvoudige verhuurservice met behulp van de JTA Transactioneel annotatie:

importeer javax.transaction.Transactional; @Service @Transactional (Transactional.TxType.SUPPORTS) openbare klasse RentalService {@Autowired privé CarRepository carRepository; @Transactional (rollbackOn = IllegalArgumentException.class, dontRollbackOn = EntityExistsException.class) openbare autoverhuur (auto auto) {return carRepository.save (auto); }}

3. Toepasbaarheid en uitwisselbaarheid

JTA Transactioneel annotatie is van toepassing op door CDI beheerde bonen en klassen die zijn gedefinieerd als beheerde bonen door de Java EE-specificatie, terwijl Spring Transactioneel annotatie is alleen van toepassing op lente-bonen.

Het is ook vermeldenswaard dat ondersteuning voor JTA 1.2 is geïntroduceerd in Spring Framework 4.0. Dus, we kunnen de JTA gebruiken Transactioneel annotatie in Spring-toepassingen. Andersom is echter niet mogelijk omdat we Spring-annotaties niet buiten de Spring-context kunnen gebruiken.

4. Conclusie

In deze tutorial hebben we de verschillen tussen Transactioneel annotaties van Spring en JTA, en wanneer we de een of de ander kunnen gebruiken.

Zoals altijd is de code van deze tutorial beschikbaar op GitHub.

Persistentie onderaan

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS