Hibernate - Envers -> تدقيق / إصدار سمة ، ولكن فقط إذا تغيرت القيمة

StackOverflow https://stackoverflow.com/questions/4602684

  •  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 وفقًا لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top