2010-03-04 4 views
5

Mam pewien kod hibernacji, który wykonuje wstawienie do bazy danych, a po jej zakończeniu uruchamiany jest niestandardowy PostInsertEventListener. (Zasadniczo wyzwalacz zapewniający odpowiednią aktualizację innych rekordów)Hibernate PostInsertEventListeners -Use Same transakcji jako insert?

Co należy zrobić, to sprawić, aby kod wewnątrz EventListener korzystał z tej samej transakcji co oryginalna wstawka, więc jeśli insert nie zostanie pomyślnie zatwierdzony, EventListener nie będzie strzelać.

Słyszałem, że można użyć metod javax.transaction.Syncronization i Hibernate do transaction.registerSyncronization(), aby to zrobić, ale nie ma przykładów użycia w dowolnym miejscu, które można znaleźć.

Każda pomoc jest doceniana.

Odpowiedz

3

Nie sądzę, że to możliwe.

Jeśli rozumiem, chcesz wykonać kod tylko wtedy, gdy transakcja zakończyła się pomyślnie (została zatwierdzona). Jeśli jednak transakcja zostanie zatwierdzona, nie można zrobić czegoś innego w tej samej transakcji, ponieważ jest ona zakończona.

Co jednak można zrobić, należy użyć PreInsertEventListener, który jest wywoływany w ramach transakcji (przed zatwierdzeniem). Detektor zdarzeń wywoła zdarzenie, jeśli transakcja się nie powiedzie (ponieważ nie wiemy, dopóki nie zostanie zatwierdzona, jeśli transakcja się powiedzie), ale wszystko, co modyfikujesz w detektorze, nie zostanie zapisane w bazie danych, jeśli transakcja się nie powiedzie. Sprawdź https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/EventListeners.html dla listy słuchaczy.

Jedno ostrzeżenie jednak. Nie powinieneś zbytnio modyfikować danych w słuchaczu. W szczególności nie powinieneś powodować żadnego leniwego ładowania kolekcji.