Nie wiem, jak działa Seam, więc z góry przepraszam, jeśli ta odpowiedź nie ma zastosowania.
Zauważyłem, że metoda, która jest @Transactional
jest protected
. To sugeruje mi, że jest wywoływany przez inną metodę wewnętrzną.
Dzięki AOP firmy Spring oznaczasz publiczne metody z @Transactional
które są pakowane i zastępowane przez proxy transakcji. Gdy klasa zewnętrzna wywołuje public
jest to wywołanie proxy, który tworzy transakcję. Jeśli klasa zewnętrzna wywoła inny public
metoda, która nie oznaczone @Transactional
który następnie wywołuje metodę wewnętrzną, co oznacza, że nie zostanie utworzona transakcja, ponieważ serwer proxy w ogóle nie jest wywoływany.
Wiosną, nawet jeśli zmienisz doWork()
metody, aby być publicznym, ten sam problem by się zdarzył. Brak transakcji, ponieważ obiekt proxy nie jest wywoływany. Wywołania metod wykonane wewnątrz klasy nie powodują wywołania obiektu proxy.
Szybkie przeczytanie dokumentacji wydaje się wskazywać, że podobnie jak Spring AOP, Seam używa proxingu CGLib . Pytanie brzmi, czy jest w stanie przekazać wszystkie metody — nawet jeśli są wywoływane z obiektu proxy. Przepraszamy za marnowanie czasu, jeśli ta odpowiedź nie ma zastosowania.