Nevím, jak Seam funguje, takže se předem omlouvám, pokud tato odpověď neplatí.
Všiml jsem si, že metoda, která je @Transactional
je protected
. Z toho mi vyplývá, že je volána jinou interní metodou.
Pomocí Spring's AOP označíte veřejné metody s @Transactional
které jsou zabaleny a nahrazeny transakčním proxy. Když externí třída zavolá public
je to volání proxy, která tvoří transakci. Pokud externí třída volá jinou public
metoda, která není označeno @Transactional
která pak volá interní metodu, což znamená, že nebude vytvořena žádná transakce, protože proxy není vůbec volána.
Na jaře, i když změníte doWork()
způsob být veřejný, nastal by stejný problém. Žádná transakce, protože není volán objekt proxy. Volání metod prováděná uvnitř třídy neprovádějí volání objektu proxy.
Rychlé přečtení některé dokumentace naznačuje, že stejně jako Spring AOP i Seam používá CGLib proxying . Otázkou je, zda je schopen proxy všechny metody -- i když jsou volány z proxy objektu. Omlouváme se za ztrátu času, pokud tato odpověď neplatí.