عند استخدام Hibernate أو Spring Data Repositories، يمكنك استخدام الحلقات الداخلية (interceptors) أو الأحداث (events) للتعامل مع الكائنات (Entities) قبل حفظها في قاعدة البيانات. لتنفيذ هذا، يمكنك استخدام الأحداث التي توفرها Hibernate مثل PreInsertEventListener
و PreUpdateEventListener
، أو تستخدم Spring Data JPA للاستفادة من الحدث @PrePersist
و @PreUpdate
.
لتنفيذ ذلك باستخدام Hibernate، يمكنك إنشاء مكون يمتد من EmptyInterceptor
ثم استخدامه لتنفيذ المنطق الخاص بك قبل الحفظ. وهناك طريقة مشابهة باستخدام Spring Data JPA.
إليك مثال بسيط باستخدام Hibernate:
javapublic 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:
javaMyInterceptor 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
واستخدامها لتنفيذ المنطق الخاص بك:
javaSession 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()
لحفظ التغييرات.
يرجى ملاحظة أنه في كلتا الحالتين، يجب أن تضيف المنطق الخاص بتحديث الحقول المحسوبة في الأماكن المناسبة بناءً على حاجتك الخاصة وطريقة عمل تطبيقك.