5 Stimmen

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

Ich habe ein Problem mit Hibernate - Envers. Ich habe ein Domänenobjekt mit nur einem geprüften Attribut status die eine der Zahlen 0,1,2,3,4,5 sein kann.

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

Jetzt funktioniert alles in Envers und Hibernate. Beim Erstellen eines neuen Item-Objekts und dessen Hinzufügen zur Datenbank wird eine Zeile in die Datenbank eingefügt. Item_AUD Datenbank-Tabelle.

Aber jetzt habe ich ein Problem mit der Aktualisierung. Meine Aktualisierung in der Hibernate Dao-Implementierung sieht so aus:

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 jeder Aktualisierung wird dies auf meiner Konsole angezeigt:

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

Das Problem ist aber, dass ich nur eine Zeile in die Tabelle einfügen möchte. REVINFO y Item_AUD wenn sich die Statusnummer geändert hat!

Zum Beispiel: Ich ändere die description des Eintrags, führen Sie die Aktualisierung mit dem Aufruf updateItem und dann schreibt Envers eine neue Revision in die Audittabellen. Aber ich möchte dieses Verhalten nicht.

Was ich will: nur wenn der Wert von status geändert wird, sollte Envers Datenbankeinträge in die Audittabellen schreiben.

Aber wie kann ich das tun?

Mit freundlichen Grüßen, Tim.

5voto

Nayan Wadekar Punkte 11136

Hierfür müssen Sie die 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 in den anderen überschriebenen Methoden nach Bedarf benutzerdefinierte Beschränkungen hinzufügen. Der Pfad zur Listener-Klasse in hibernate.cfg.xml sollte entsprechend konfiguriert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X