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.
Ich würde wirklich lieben es, wenn dies im 5.x Release zur Verfügung gestellt wurde :) –
Seien Sie sicher, dass die JIRA up-Abstimmung, wenn Sie nicht haben. – Naros