Transaction JPA manuelle vs @Transactional déclaratif
Remplace les blocs verbeux begin/commit/rollback par une seule annotation @Transactional.
@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;
}
}
@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);
}
}
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.
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.