Hibernate - Envers -> تدقيق / إصدار سمة ، ولكن فقط إذا تغيرت القيمة
-
25-09-2019 - |
سؤال
لدي مشكلة مع السبات - envers. لدي كائن مجال مع سمة مراجعة واحدة فقط status
والتي يمكن أن تكون واحدة من الأرقام 0،1،2،3،4،5.
@Entity
public class Item {
...
@Audited
private int status;
... other variables, setter/getter, ...
}
الآن ، كل شيء في Envers و Hibernate يعمل. إنشاء كائن عنصر جديد وإضافته إلى قاعدة البيانات يتم إدراج صف فيItem_AUD
جدول قاعدة البيانات.
لكن الآن لدي مشكلة في تحديثه. يشبه التحديث الخاص بي في تطبيق السباتي DAO:
public void updateItem(Item i) {
SessionFactory sessionFac = HibernateUtility.getSessionFactory();
Session s = sessionFac.getCurrentSession();
Transaction trans = s.beginTransaction();
s.update(i);
s.flush();
trans.commit();
}
في كل تحديث ، يتم طباعة هذا على وحدة التحكم الخاصة بي:
Hibernate: update Item set amount=?, description=?, status=? where id=?
Hibernate: insert into REVINFO (REVTSTMP) values (?)
Hibernate: insert into Item_AUD (REVTYPE, status, id, REV) values (?, ?, ?, ?)
لكن المشكلة هي أنني أريد فقط إدراج صف في REVINFO
و Item_AUD
إذا تغير رقم الحالة!
على سبيل المثال: أقوم بتغيير description
من العنصر ، قم بإجراء التحديث مع الاتصال updateItem
ثم يكتب المحتالون مراجعة جديدة لجداول التدقيق. لكني لا أريد هذا السلوك.
ما أريد: فقط إذا كانت قيمة status
يتم تغييره ، يجب على envers كتابة إدخالات قاعدة البيانات في جداول التدقيق.
ولكن كيف يمكنني فعل هذا؟
مع أطيب التحيات ، تيم.
المحلول
لهذا ، عليك أن تمتد aditeVentListener وتجاوز أساليبها.
public class EnversListener extends AuditEventListener {
@Override
public void onPostInsert(PostInsertEvent event) {
Object o = event.getEntity();
if (o instanceof Item) {
Item currentItem = (Item) o;
Item previousItem = findItemById(currentItem.getId());
if(previousItem != null)
if (currentItem.getStatus() != previousItem.getStatus())
super.onPostInsert(event);
} else {
super.onPostInsert(event);
}
}
@Override
public void onPostDelete(PostDeleteEvent event) {
super.onPostDelete(event);
}
@Override
public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
super.onPostRecreateCollection(event);
}
@Override
public void onPostUpdate(PostUpdateEvent event) {
super.onPostUpdate(event);
}
@Override
public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
super.onPreRemoveCollection(event);
}
@Override
public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
super.onPreUpdateCollection(event);
}
}
يمكنك إضافة قيود مخصصة في الأساليب المتجاوز الأخرى كما هو مطلوب. يجب تكوين المسار إلى فئة المستمع داخل hibernate.cfg.xml وفقًا لذلك.