Manuel JPA İşlemi ile Bildirimsel @Transactional Karşılaştırması
Ayrıntılı begin/commit/rollback bloklarını tek bir @Transactional açıklamasıyla değiştirin.
@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);
}
}
Şablon kod yok
Tek bir açıklama, tekrarlayan begin/commit/rollback try-catch bloklarının yerini alır.
Daha güvenli geri alma
Kapsayıcı, denetlenmemiş istisnalarda geri almayı garanti eder — catch bloğunu unutma riski yok.
Bildirimsel kontrol
Yayılım, yalıtım ve geri alma kuralları açıklama öznitelikleri olarak ifade edilir.
Jakarta EE 8 / Java 11'den itibaren geniş çapta kullanılabilir
Manuel işlem yönetimi, try-catch bloklarına sarılmış açık begin(), commit() ve rollback() çağrıları gerektirir — her hizmet yöntemi bu şablon kodu tekrar eder. @Transactional açıklaması, yaşam döngüsü yönetimini kapsayıcıya devreder: yöntemden önce bir işlem başlatır, başarıda commit eder ve RuntimeException durumunda otomatik olarak geri alır.