Enterprise Intermédiaire

Remplace les blocs verbeux begin/commit/rollback par une seule annotation @Transactional.

✕ Java EE
@PersistenceContext
EntityManager em;

public void transferFunds(Long from, Long to,
                          BigDecimal amount) {
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    try {
        Account src = em.find(Account.class, from);
        Account dst = em.find(Account.class, to);
        src.debit(amount);
        dst.credit(amount);
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
        throw e;
    }
}
✓ Jakarta EE 8+
@ApplicationScoped
public class AccountService {
    @PersistenceContext
    EntityManager em;

    @Transactional
    public void transferFunds(Long from, Long to,
                              BigDecimal amount) {
        var src = em.find(Account.class, from);
        var dst = em.find(Account.class, to);
        src.debit(amount);
        dst.credit(amount);
    }
}
Un problème avec ce code ? Dites-le nous.
🗑️

Sans code répétitif

Une seule annotation remplace les blocs répétitifs try-catch de begin/commit/rollback.

🛡️

Rollback plus sûr

Le conteneur garantit le rollback sur les exceptions non vérifiées — sans risque d'oublier le bloc catch.

📐

Contrôle déclaratif

Les règles de propagation, d'isolation et de rollback s'expriment comme attributs de l'annotation.

Ancienne Approche
Transaction manuelle
Approche Moderne
@Transactional
Depuis JDK
11
Difficulté
Intermédiaire
Transaction JPA manuelle vs @Transactional déclaratif
Disponible

Disponible depuis Jakarta EE 8 / Java 11

La gestion manuelle des transactions nécessite des appels explicites à begin(), commit() et rollback() enveloppés dans des blocs try-catch — chaque méthode de service répète ce code répétitif. L'annotation @Transactional délègue la gestion du cycle de vie au conteneur : démarre une transaction avant la méthode, valide en cas de succès et annule en cas de RuntimeException automatiquement.

Partager 𝕏 🦋 in