Не съм запознат с това как работи Seam, така че се извинявам предварително, ако този отговор не е приложим.
Забелязах, че методът, който е @Transactional
е protected
. Това за мен означава, че се извиква от друг вътрешен метод.
С AOP на Spring маркирате обществеността методи с @Transactional
които са обвити и заменени с прокси за транзакция. Когато външен клас извика public
метод, той извиква проксито, което формира транзакцията. Ако външният клас извика друг public
метод, който не е маркирани с @Transactional
който след това извиква вътрешен метод, което означава, че няма да има създадена транзакция, защото проксито изобщо не се извиква.
През пролетта, дори ако промените своя doWork()
методът да бъде публичен, ще се случи същият проблем. Няма транзакция, защото прокси обектът не се извиква. Извикванията на метод, направени вътре в класа, не извършват извиквания към прокси обекта.
Бърз прочит на част от документацията изглежда показва, че подобно на Spring AOP, Seam използва CGLib проксииране . Въпросът е дали може да проксира всички методи -- дори ако те се извикват от проксиирания обект. Съжалявам, че ви губя времето, ако този отговор не е приложим.