2017-01-19 2 views
1

Wir haben ein Unternehmen mit einer String-Eigenschaft, ist dieses Thema sehr häufig ändern, und so nehmen wir @NotAudited darauf. Dies führt jedoch (verständlicherweise) dazu, dass die Spalte in der Audit-Tabelle null ist.Envers - Istwert @NotAudited Feld einfügen

Wir möchten den tatsächlichen Wert der String-Eigenschaft in die Audit-Tabelle einfügen, wenn sich die Entität (eine der überprüften Spalten) ändert, aber keinen neuen Datensatz in die Audit-Tabelle einfügen soll String-Eigenschaft ändert sich.

Wie kann ich das tun?

Antwort

2

Was Sie beschreiben, ist, was wir als bedingte Auditing bezeichnen, die Sie Details in der Envers-Dokumentation finden können.

Das Grundprinzip besteht darin, dass Sie die Eigenschaft mit @Audited zu annotieren würde weiterhin aber bestimmen, ob eine andere Eigenschaft geändert höchstwahrscheinlich während einer PostUpdateEvent und wenn Ihre spezifische Eigenschaft ist alles was geändert, würden Sie nicht die PostUpdateEvent an den Delegaten Envers Standard-Listener-Implementierung.

Einige Pseudo-Code könnte wie folgt aussehen:

public class CustomEnversPostUpdateEventListener 
     extends EnversPostUpdateEventListenerImpl { 
    public CustomEnversPostUpdateEventListener(EnversService enversService) { 
     super(enversService); 
    } 

    @Override 
    public void onPostUpdate(PostUpdateEvent event) { 
     final String entityName = event.getPersister().getEntityName(); 
     if (getEnversService().getEntityConfigurations().isVersioned(entityName)) { 
     if (MySpecialEntity.class.getName().equals(entityName)) { 
      // Compare event.getState() against event.getOldState() 
      // Determine if only your special String changed or not 
      if (!otherFieldsChangedBesidesSpecialProperty) { 
      return; 
      } 
     } 
     // delegate to default implementation 
     super.onPostUpdate(event); 
     } 
    } 
} 

Der Ansatz zu diesem Zeitpunkt dieser Zuschreibung auf benötigt erfordert, dass Sie den Hörer Registrierung innerhalb EnversIntegrator auch außer Kraft setzen. Die Ausweitung dieser Zuhörer, erfordert Kenntnisse im Umgang mit staatlichen Vergleich stellt eine erhebliche Belastung für den Benutzer stattdessen eine steckbare Lösung anzubieten.

Eine steckbare Lösung ist das Ziel hinter HHH-11326. Was ich möchte ein JPA-ähnliches Konzept wäre einzuführen, in denen ein @AuditListener auf der geprüften Stelle Klasse platziert werden und Envers würde stattdessen für dieses Verhalten an den Hörer Implementierung delegiert.

Es gibt nichts in Stein gemeißelt noch darüber, wie dies funktionieren würde, so dass die folgende ist einfach ein Gehirn-Dump meiner eigenen persönlichen Gedanken zu diesem Thema und wie es aussehen könnte und weise Code spielen:

public class MyEntityAuditListener extends AbstractAuditListener { 
    @Override 
    public boolean onPostUpdate(EnversPostUpdateEvent event) { 
     // return true = allow the audit operation 
     // return false = veto the audit operation 
     if (event.getPropertyChangeCount() != 1) { 
     return true; 
     } 
     return !event.isPropertyChanged("mySpecialString");  
    } 
} 

@Entity 
@Audited 
@AuditListener(MyEntityAuditListener.class) 
public class MyEntity { 
    // ... 
    private string mySpecialString; 
} 

das schöne daran ist, dass die EnversPostUpdateEvent ermöglicht es uns, zu abstrahieren, ein großer Teil der Envers Interna entfernt, eine saubere API aussetzt, die Benutzer leicht Entscheidungen treffen können, ob ein Prüfungsvorgang Veto ohne viel darüber, wie Hibernate Ereignisse kennen oder das Innere von Envers funktioniert.

Wie die JIRA darauf hinweist, ist dieses neue @AuditListener Konzept etwas, das ich in den nächsten Monaten in der nächsten Hauptversion von Hibernate Envers 6.0 vorstellen werde.

+0

Ich würde wirklich lieben es, wenn dies im 5.x Release zur Verfügung gestellt wurde :) –

+0

Seien Sie sicher, dass die JIRA up-Abstimmung, wenn Sie nicht haben. – Naros

Verwandte Themen