Hibernate - Envers -> аудит / управление версиями атрибута, но только если значение изменилось - PullRequest
5 голосов
/ 05 января 2011

У меня проблема с Hibernate - Envers. У меня есть объект домена только с одним проверенным атрибутом status, который может быть одним из чисел 0,1,2,3,4,5.

@Entity
public class Item {
    ...
    @Audited
    private int status;
    ... other variables, setter/getter, ...
}

Теперь все в Envers и Hibernate работает. При создании нового объекта Item и добавлении его в базу данных строка вставляется в таблицу базы данных Item_AUD.

Но теперь у меня проблема с его обновлением. Мое обновление в реализации Hibernate 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 должен записывать записи базы данных в таблицы аудита.

Но как я могу это сделать?

С наилучшими пожеланиями, Тим.

1 Ответ

5 голосов
/ 05 января 2011

Для этого вам необходимо расширить AuditEventListener и переопределить его методы.

    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 должен быть настроен соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...