Fire Hibernate benutzerdefinierter Ereignis-Listener vor automatisch ausgelösten Standard-Listenern

8

Ich habe einen benutzerdefinierten Hibernate-Event-Listener erstellt, der org.hibernate.event.PreInsertEventListener erweitert. Der benutzerdefinierte Listener überschreibt die onPreInsert-Methode und legt ein Feld einer "Kontakt" -Entität fest, bevor es in der Datenbank mit einem DAO gespeichert wird.

Problem ist, das Feld war NULL, bevor der Listener es einen Wert gibt und Standard-Hibernate-Ereignis Listener werden automatisch vor meinem benutzerdefinierten Listener ausgelöst. Während sie das ddl überprüfen, sehen sie die not-null-Einschränkung für das Feld und werfen eine Null-Check-Ausnahme, bevor der benutzerdefinierte Ereignis-Listener dem Feld seinen Wert geben kann. (Dasselbe Problem tritt auf, wenn Spring-AOP anstelle von benutzerdefinierten Listenern im Ruhezustand verwendet wird: Der Standard-Hibernate-Listener wird vor meiner Aspect-Methode ausgeführt)

Es ist also möglich, die Triggerreihenfolge der Hibernate-Zuhörer einzustellen, wenn ich weiß, dass ich eine Spring Session-Factory verwende?

Danke

    
Jihed Amine 30.05.2011, 15:17
quelle

2 Antworten

1

Ich habe ein Beispiel für Sie, das Datenhistorie für eine Personenentität erstellt. Hoffe es hilft.

Ich musste eine Hilfsschnittstelle erstellen:

%Vor%

Dies ist die Listener-Implementierung :

%Vor%

Die Personeneinheit :

%Vor%

Diese Implementierung erstellt einen Datehistory-Datensatz für die Personenentität vor der Persistenz und aktualisiert sie vor der Zusammenführung. Die Eigenschaft "datahistory" hat eine Nicht-Null-Einschränkung. Dies entspricht also Ihrem Problem mit der Nicht-Null-Eigenschaft der Kontakteinheit. Hoffe es war nützlich.

    
lepike 09.06.2011, 20:46
quelle
1

IMHO, was Sie tun, ist Overkill. Sie können dasselbe mit Interceptor

erreichen

Wenn Sie dies bereits wissen und PreInsetEventListener aus bestimmten Gründen überschreiben (interessant zu wissen), müssen Sie mit der Überschreibung der Standardimplementierungen von org.hibernate.event.def.AbstractSaveEventListener beginnen. Zum Beispiel org.hibernate.event.def.DefaultSaveEventListener.

Beachten Sie, dass die Überprüfung der Nullwert- und Fremdschlüsseleinschränkung in 'AbstractSaveEventListener.performSaveOrReplicate' stattfindet und EntityActions zur Aktionswarteschlange hinzugefügt werden. Diese Aktionen werden während der Sitzungsspülung ausgeführt. Dies ist der Fall, wenn Sie von EntityActions einen Aufruf an Ihren PreInsertEventListener erhalten.

    
Adi 06.06.2011 20:20
quelle