Jag är inte bekant med hur Seam fungerar så jag ber om ursäkt på förhand om detta svar inte gäller.
Jag märkte att metoden som är @Transactional
är protected
. Detta antyder för mig att det anropas med en annan intern metod.
Med Springs AOP markerar du allmänheten metoder med @Transactional
som lindas in och ersätts med en transaktionsproxy. När en extern klass anropar public
metoden anropar den proxyn som bildar transaktionen. Om den externa klassen anropar en annan public
metod som inte är markerad med @Transactional
som sedan anropar en intern metod vilket innebär att det inte skapas någon transaktion eftersom proxyn inte anropas alls.
På våren, även om du ändrar din doWork()
metod för att vara offentlig, skulle samma problem inträffa. Ingen transaktion eftersom proxyobjektet inte anropas. Metodanrop som görs inuti klassen gör inte anrop till proxyobjektet.
En snabb läsning av en del dokumentation verkar tyda på att Seam, precis som Spring AOP, använder CGLib-proxy . Frågan är om den kan proxysätta alla metoder -- även om de anropas inifrån det proxyade objektet. Ursäkta att jag slösar bort din tid om det här svaret inte stämmer.