Frage

Gibt es eine allgemein anerkannte, bewährte-to-work Art und Weise Hibernate, die eine Geschichte von einer Entitys Änderungen in der Datenbank hält?

Wir brauchen den Überblick über ganz bestimmte Objekte zu halten, und wir wollen in der Lage sein, Änderungen an Objekten rückgängig zu machen.

Ich habe versucht, die Abfangjäger von Hibernate, aber der alte Zustand des Objekts ist nur verfügbar, wenn merge() tun. Meistens tun wir update() oder saveOrUpdate() obwohl ...

Ich bin zur Zeit im Stich gelassen verzugs bestehen bleiben zusammen mit Guice verwalten die Sitzung.

War es hilfreich?

Lösung

Ich habe dies mit einem Interceptor getan (die Schaffung meines eigenen basierend auf EmptyInterceptor ). Ich war in der Lage, alle Änderungen zu erhalten (merge, speichern saveOrUpdate und löschen) in onFlushDirty ().

Die Methoden der EmptyInterceptor ich verwendet:

@Override
public boolean onFlushDirty(Object object, Serializable id,
    Object[] newValues, Object[] oldValues, String[] properties,
    Type[] types) throws CallbackException {

@Override
public boolean onSave(Object object, Serializable id, Object[] newValues,
    String[] properties, Type[] types) throws CallbackException {

@Override
public void onDelete(Object object, Serializable id, Object[] newValues,
    String[] properties, Type[] types) throws CallbackException {

In onFlushDirty () ich den vorherigen Zustand des Unternehmens abfragen hatte:

Connection c = sessionFactory.getCurrentSession().connection();
Session session = sessionFactory.openSession(c);

BaseEntity newBaseEntity = (BaseEntity) object;
BaseEntity oldBaseEntity = (BaseEntity) session.get(newBaseEntity.getClass(), newBaseEntity.getId());

Andere Tipps

JBoss envers ist vielleicht, was Sie suchen.

Die Envers Projekt soll einfach Überwachung aktivieren / Versionierung von persistenten Klassen. Alles, was Sie tun müssen, ist annotate Ihre persistente Klasse oder einige seiner Eigenschaften, dass Sie mit @Audited zu Audit wollen. Für jeden geprüften Stelle wird eine Tabelle erstellt, die die Geschichte der Änderungen an der Einheit gemacht wird halten. Anschließend können Sie abrufen und Abfrage historische Daten ohne viel Aufwand.

Ähnlich wie Subversion hat die Bibliothek ein Konzept von Revisionen. Grundsätzlich eine Transaktion ist eine Revision (es sei denn, die Transaktion keine geprüften Stellen ändern haben). Da die Revisionen global sind, eine Revisionsnummer haben, können Sie bei dieser Revision für verschiedene Einheiten abzufragen, das Abrufen dieser Revision eine (Teil-) Ansicht der Datenbank an. Sie können eine Revisionsnummer mit einem Datum finden, und umgekehrt, können Sie das Datum erhalten, bei der eine Revision begangen wurde.

Envers von JBoss ist wahrscheinlich das, was Sie suchen:

Die Envers Projekt soll einfach Überwachung aktivieren / Versionierung von persistenten Klassen. Alles, was Sie tun müssen, ist annotate Ihre persistente Klasse oder einige seiner Eigenschaften, dass Sie mit @Audited zu Audit wollen. Für jeden geprüften Stelle wird eine Tabelle erstellt, die die Geschichte der Änderungen an der Einheit gemacht wird halten. Anschließend können Sie abrufen und Abfrage historische Daten ohne viel Aufwand.

Es gibt eine automatische Versionierung und Prüfungsprojekt, das von JBoss entwickelt: envers . Das kann ich empfehlen die Verwendung von, ich habe Auditierung von Hand durchgeführt, bevor und das kann wirklich chaotisch, wenn Sie beginnen komplexere usecases nähert.

Ich habe genau das gleiche Problem hat. Ein Weg, um sie herum zu lock() mit dem vorherigen Zustand und dann merge() mit dem neuen Staat, anstatt update() tat nur mit dem neuen Staat.

Dann ist Hibernate sich der vor / nach, und es ist in den Abfangjäger / Event-Listener zur Verfügung.

HTH.

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