Jeg er ikke bekendt med, hvordan Seam fungerer, så jeg undskylder på forhånd, hvis dette svar ikke gælder.
Jeg har bemærket, at metoden, der er @Transactional
er protected
. Dette antyder for mig, at det kaldes af en anden intern metode.
Med Springs AOP markerer du offentligheden metoder med @Transactional
som er pakket ind og erstattet med en transaktionsfuldmagt. Når en ekstern klasse kalder public
metode, kalder den proxyen, som danner transaktionen. Hvis den eksterne klasse kalder en anden public
metode, der ikke er markeret med @Transactional
som derefter kalder en intern metode, hvilket vil sige, at der ikke bliver oprettet nogen transaktion, fordi proxyen slet ikke bliver kaldt.
Om foråret, selvom du ændrer din doWork()
metode til at være offentlig, ville det samme problem ske. Ingen transaktion, fordi proxy-objektet ikke kaldes. Metodekald foretaget inde i klassen foretager ikke kald til proxy-objektet.
En hurtig læsning af noget dokumentation synes at indikere, at Seam ligesom Spring AOP bruger CGLib-proxy . Spørgsmålet er, om det er i stand til at proxye alle metoder -- også selvom de kaldes inde fra det proxyede objekt. Beklager, at du spilder din tid, hvis dette svar ikke gælder.