البرمجة

كيفية تنفيذ معالجة قبل حفظ البيانات في Hibernate و Spring Data JPA

عند استخدام Hibernate أو Spring Data Repositories، يمكنك استخدام الحلقات الداخلية (interceptors) أو الأحداث (events) للتعامل مع الكائنات (Entities) قبل حفظها في قاعدة البيانات. لتنفيذ هذا، يمكنك استخدام الأحداث التي توفرها Hibernate مثل PreInsertEventListener و PreUpdateEventListener، أو تستخدم Spring Data JPA للاستفادة من الحدث @PrePersist و @PreUpdate.

لتنفيذ ذلك باستخدام Hibernate، يمكنك إنشاء مكون يمتد من EmptyInterceptor ثم استخدامه لتنفيذ المنطق الخاص بك قبل الحفظ. وهناك طريقة مشابهة باستخدام Spring Data JPA.

إليك مثال بسيط باستخدام Hibernate:

java
public class MyInterceptor extends EmptyInterceptor { @Override public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if (entity instanceof YourEntityClass) { YourEntityClass yourEntity = (YourEntityClass) entity; // تحديث الحقول المحسوبة هنا } return super.onSave(entity, id, state, propertyNames, types); } }

ثم يمكنك تكوين المثيل الخاص بالحلقة الداخلية وتسجيله مع Hibernate:

java
MyInterceptor myInterceptor = new MyInterceptor(); SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) sessionFactory; sessionFactoryImpl.getSessionFactoryOptions().setInterceptor(myInterceptor);

بالنسبة لـ Spring Data JPA، يمكنك استخدام الأحداث @PrePersist و @PreUpdate في كائنات الكيان الخاصة بك:

java
@Entity public class YourEntityClass { @PrePersist public void prePersist() { // تحديث الحقول المحسوبة هنا } @PreUpdate public void preUpdate() { // تحديث الحقول المحسوبة هنا } }

ستُستدعى الطرق prePersist() و preUpdate() تلقائيًا قبل حفظ الكائن في قاعدة البيانات.

يرجى ملاحظة أنه يجب استبدال YourEntityClass بالاسم الفعلي لكائن الكيان الخاص بك، وأن تضيف المنطق الخاص بتحديث الحقول المحسوبة في الأماكن المناسبة.

المزيد من المعلومات

بالتأكيد! عند استخدام Hibernate، يمكنك أيضًا استخدام الحلقات الحالية (current sessions) لتنفيذ المنطق قبل الحفظ. يمكنك الحصول على الجلسة الحالية من SessionFactory واستخدامها لتنفيذ المنطق الخاص بك:

java
Session session = sessionFactory.getCurrentSession(); YourEntityClass entity = session.get(YourEntityClass.class, entityId); // تحديث الحقول المحسوبة هنا session.saveOrUpdate(entity);

وفي Spring Data JPA، يمكنك أيضًا استخدام الحلقات الحالية لتنفيذ المنطق قبل الحفظ. يمكنك تحقيق ذلك باستخدام @Transactional للتعامل مع الجلسة الحالية:

java
@Autowired private EntityManager entityManager; @Transactional public void updateEntity(Long entityId) { YourEntityClass entity = entityManager.find(YourEntityClass.class, entityId); // تحديث الحقول المحسوبة هنا entityManager.merge(entity); }

ضمن المنطق الخاص بـ updateEntity()، يتم الحصول على الكائن الحالي باستخدام EntityManager، ثم يمكنك تحديث الحقول المحسوبة قبل استخدام merge() لحفظ التغييرات.

يرجى ملاحظة أنه في كلتا الحالتين، يجب أن تضيف المنطق الخاص بتحديث الحقول المحسوبة في الأماكن المناسبة بناءً على حاجتك الخاصة وطريقة عمل تطبيقك.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر