Wystąpił problem z moim obiektem HibernateInterceptor. Rozszerzam EmptyInterceptor
i zastępuję metodę onFlushDirty
. Używam tej metody do ręcznego sprawdzania brudnych wartości (porównaj poprzednie wartości z bieżącymi wartościami), aby zapisać dzienniki audytu dla zmienionych encji. Problem polega na tym, że w pewnych określonych sytuacjach zdarza się, że ta sama jednostka jest przekazywana do metody onFlushDirty
kilka razy przed wywołaniem metody postFlush
. Poprzednie wartości i bieżące wartości nie zmieniają się z połączenia na połączenie. Więc mój dziennik kontroli zapisuje kilka razy te same zmiany. Jeśli właściwość mojej jednostki zmienia się (np. Z NEW
na IN_PROGRESS
), zmiana ta jest przekazywana dwa lub więcej razy do onFlushDirty
. Dlaczego tak się dzieje? To jest naprawdę dziwne zachowanie i nie oczekuje się w mojej opinii.Element przechwytujący hibernację onFlushDirty wywoływany wiele razy z tymi samymi wartościami
Wywołanie przechwytywacza onFlushDirty
jest spowodowane zachowaniem stanu hibernacji w postaci auto-flush
. Kiedy kwerenda jest wykonywana podczas sesji, opróżnia wszystkie brudne jednostki w sesji. Spodziewam się, że zostanie to zrobione tylko raz dla brudnej istoty, ale wydaje się, że byt jest nadal oznaczony jako "brudny", nawet po kolorze. Następnie kolejne zapytanie jest wykonywane w ramach sesji i ponownie - obiekt jest ponownie opróżniany. Stare wartości i bieżące wartości są takie same jak przy pierwszym spłukiwaniu.
Próbowałem odtworzyć ten problem w teście, ale nie mogłem sprowokować takich wielokrotnych powtórzeń. Mam nadzieję, że eksperci Hibernate mogą mi pomóc, zanim będę musiał debugować cały kod Hibernate.
Pozdrawiam, Chris
Cześć Chris, ale w jaki sposób pan rozwiązać swój problem? –
Cześć Chris, ale w jaki sposób rozwiązałeś swój problem z powielaniem zapisów w dzienniku kontroli? –
Cześć Ołeksandr, śledzę przechodzące już jednostki na mapie zapisywania wątków, aby upewnić się, że jednostka nie jest zapisana dwukrotnie. Kiedy Hibernate wywołuje metodę "afterTransactionCompletion" przechwytywacza, kontynuuję i wykonuję przetwarzanie dziennika audytu dla zebranych encji. Mam nadzieję, że pomaga ... – theFriedC