Ich habe eine RESTful-API, die eine mit @EntityListners annotierte Entitätsklasse verwendet. Und in der EntityListner.java habe ich eine Methode mit @PostPersist kommentiert. Wenn also dieses Ereignis ausgelöst wird, möchte ich alle Informationen bezüglich der Entität extrahieren, die gerade in der Datenbank erhalten geblieben ist. Aber wenn ich das versuche, erzeugt Glassfish eine Ausnahme und die Methode in der EntityListner-Klasse wird nicht wie erwartet ausgeführt. Hier ist der Code
%Vor%Wenn ich die auskommentierte successMessage Nachricht anstelle von custData strong> sende, funktioniert alles einwandfrei.
Ссылка sagt Folgendes zu den Entity Lifecycle-Methoden, und ich frage mich, ob das der Fall ist hier.
Um Konflikte mit der ursprünglichen Datenbankoperation zu vermeiden, die das Entity-Lifecycle-Ereignis auslöst (das noch läuft), sollten Callback-Methoden keine EntityManager- oder Query-Methoden aufrufen und nicht auf andere Entitätsobjekte zugreifen
Irgendwelche Ideen?
Wie dieser Absatz sagt, unterstützt der Standard das Aufrufen von Entity Manager-Methoden nicht innerhalb von Entity-Listenern. I stark empfehle den Aufbau von custData
von der persistenten Entität, wie Heiko Rupp in seiner Antwort sagt. Wenn das nicht möglich ist, überlegen Sie:
Wenn Sie Spring-Transaktionen verwenden, ist der Code sehr ähnlich, mit nur einigen Änderungen des Klassennamens.
Einige Hinweise:
GeplantesExecutorService Javadoc , um asynchrone Aktionen auszulösen.
Transaktionssynchronisierung mit JTA: Transaktion Javadoc und Synchronisation Javadoc
die Spring-Entsprechungen: TransactionSynchronizationManager Javadoc und TransactionSynchronization Javadoc .
Ich nehme an, dass Sie möglicherweise eine NPE sehen, da Sie möglicherweise den von Ihnen zitierten Absatz verletzen:
%Vor% Das find
scheint implizit nach dem Objekt zu suchen (wie Sie es beschreiben), das nicht vollständig mit der Datenbank synchronisiert und daher noch nicht zugänglich ist.
In seiner Antwort bemerkte Gpeche, dass es ziemlich einfach ist, seine Option # 2 in Spring zu übersetzen. Um anderen die Mühe zu ersparen:
%Vor% Die Servicemethode (hier, updateEndpoints()
) kann die JPA EntityManager
(in meinem Fall Abfragen und Aktualisierungselemente) ohne Probleme verwenden. Achten Sie darauf, die updateEndpoints()
-Methode mit @Transaction(propagation = Propagation.REQUIRES_NEW)
zu kommentieren, um sicherzustellen, dass eine neue Transaktion zum Ausführen der Persistenzvorgänge vorhanden ist.
Nicht direkt mit der Frage verbunden, aber ApplicationContextProvider
ist nur eine benutzerdefinierte Klasse, die einen App-Kontext zurückgibt, da JPA 2.0-Entity-Listener keine verwalteten Komponenten sind und ich zu faul bin, hier @Configurable
zu verwenden. Hier ist es der Vollständigkeit halber:
Tags und Links java jpa eclipselink glassfish-3 entitylisteners