Hibernate - Envers -> Revision / Versionierung eines Attributs, aber nur, wenn der Wert geändert
-
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.
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.