Hibernate - Envers -> Revision / Versionierung eines Attributs, aber nur, wenn der Wert geändert

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

  •  25-09-2019
  •  | 
  •  

Frage

habe ich ein Problem mit Hibernate - Envers. Ich habe ein Domain-Objekt mit nur einem geprüften Attribute status die 0,1,2,3,4,5 eine der Zahlen sein kann.

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

Nun, alles in Envers und Hibernate funktioniert. Erstellen eines neuen Item-Objekt und fügen Sie sie in die Datenbank eine Zeile in theItem_AUD Datenbanktabelle eingefügt wird.

Aber jetzt habe ich ein Problem damit zu aktualisieren. Mein Update in der Hibernate Dao Implementierung sieht aus wie:

public void updateItem(Item i) {
    SessionFactory sessionFac = HibernateUtility.getSessionFactory();
    Session s = sessionFac.getCurrentSession();
    Transaction trans = s.beginTransaction();
    s.update(i);
    s.flush();
    trans.commit();
}

Bei jedem Update wird diese auf meiner Konsole ausgegeben:

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 (?, ?, ?, ?)

Aber das Problem ist, dass ich nur eine Zeile in die REVINFO und Item_AUD, wenn die Statusnummer geändert hat eingefügt werden soll!

Zum Beispiel: Ich habe die description des Elements ändern, führen Sie das Update mit updateItem aufrufen und dann Envers schreibt eine neue Revision der Revisionstabellen. Aber ich will nicht, dieses Verhalten.

Was ich will. Nur dann, wenn der Wert von status geändert wird, Envers sollte Datenbankeinträge in die Revisionstabellen schreibt

Aber wie kann ich das tun?

Mit besten Grüßen, Tim.

War es hilfreich?

Lösung

Dazu müssen Sie erweitern AuditEventListener & seine Methoden außer Kraft setzen.

    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);
      }
}

Sie können benutzerdefinierte Einschränkungen in den anderen überschriebenen Methoden hinzufügen, je nach Bedarf. Der Weg zum Hörer Klasse innerhalb hibernate.cfg.xml sollte entsprechend konfiguriert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top