معاملة JPA اليدوية مقابل @Transactional التصريحية
استبدل كتل begin/commit/rollback المطوّلة بتعليق توضيحي @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);
}
}
هل ترى مشكلة في هذا الكود؟ أخبرنا.
لماذا يتفوق الأسلوب الحديث
لا كليشيه
تعليق توضيحي واحد يستبدل كتل try-catch المتكررة لـ begin/commit/rollback.
تراجع أكثر أماناً
الحاوية تضمن التراجع عن الاستثناءات غير المفحوصة — لا خطر نسيان كتلة catch.
تحكم تصريحي
قواعد الانتشار والعزل والتراجع مُعبَّر عنها كسمات تعليق توضيحي.
الأسلوب القديم
معاملة يدوية
الأسلوب الحديث
@Transactional
منذ JDK
11
الصعوبة
متوسط
دعم JDK
معاملة JPA اليدوية مقابل @Transactional التصريحية
متاح
متاح على نطاق واسع منذ Jakarta EE 8 / Java 11
كيف يعمل
تتطلب إدارة المعاملات اليدوية استدعاءات صريحة لـ begin() و commit() و rollback() مغلّفةً في كتل try-catch — كل دالة خدمة تكرر هذه الكليشيهات. يفوّض التعليق التوضيحي @Transactional إدارة دورة الحياة إلى الحاوية: تبدأ معاملةً قبل الدالة وتُودعها عند النجاح وتتراجع عنها عند RuntimeException تلقائياً.
توثيق ذو صلة