Transaction - Spring - Exception  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Claudio Nazzari
Debugger
[Avatar]

Membro desde: 18/07/2006 09:59:56
Mensagens: 57
Offline

Opa!

Criei um sistema com Spring, Hibernate e JSF. Porem nao estou conseguindo criar Transactions nos meus metodos de negocio. O Sistema funciona perfeitamente, mas o controle de transação aparentemente nao existe.
Gostaria que todas as minhas classes de negocio faça o commit apenas no retorno do metodo e faça rollback quando lança Exception, algo similar com o controle de transação do EJB Session. Meu codigo é o seguinte:


ClientBusiness.java


ClientBusinessImpl.java



applicationContext.xml


Dessa forma configurada não funciona de geito nenhum !
Alguem pode me ajudar?

Obrigado !

This message was edited 2 times. Last update was at 15/10/2009 11:10:40


-------------------------
Claudio Nazzari
clanazzari@gmail.com
[Email] [MSN]
maschiojv
JavaChild
[Avatar]

Membro desde: 27/02/2007 18:29:37
Mensagens: 119
Offline

Não tenho certeza, mas acho que anotações não são extensíveis, ou seja, a anotação @Transactional no caso só é aplicada para ClientBusiness e nao para ClientBusinessImpl.

tente colocar no ClientBusinessImpl e ver se rosolve
Claudio Nazzari
Debugger
[Avatar]

Membro desde: 18/07/2006 09:59:56
Mensagens: 57
Offline

maschiojv wrote:Não tenho certeza, mas acho que anotações não são extensíveis, ou seja, a anotação @Transactional no caso só é aplicada para ClientBusiness e nao para ClientBusinessImpl.

tente colocar no ClientBusinessImpl e ver se rosolve


Coloquei mas o problema continua...

É como se nao existise nenhuma transação nos metodos, ja tentei colocar @Transactional nos metodos mas tambem nao funciona.





-------------------------
Claudio Nazzari
clanazzari@gmail.com
[Email] [MSN]
jgbt
GUJ Master
[Avatar]

Membro desde: 04/06/2003 15:01:48
Mensagens: 1286
Localização: Porto Alegre/RS
Offline

Pergunta:
O seu banco suporta transações?

[]´s

João Bier
Desenvolvedor Java
[Email]
legionarioba
JavaTeenager
[Avatar]

Membro desde: 24/03/2003 00:40:42
Mensagens: 171
Localização: Salvador
Offline

A documentação do Spring sugere o uso da anotação @Transactional nas classes concretas:

Spring recommends that you only annotate concrete classes (and methods of concrete classes)
with the @Transactional annotation, as opposed to annotating interfaces. You certainly
can place the @Transactional annotation on an interface (or an interface method), but
this works only as you would expect it to if you are using interface-based proxies. The fact
that annotations are not inherited means that if you are using class-based proxies
(proxy-target-class="true") or the weaving-based aspect (mode="aspectj"),
then the transaction settings are not recognized by the proxying and weaving infrastructure,
and the object will not be wrapped in a transactional proxy, which would be decidedly bad.


Spring Documentation - Part IV (Data Access) - 10.5 Declarative transaction management - Using @Transactional

Outra coisa, sua classe está no base-package que você definiu no elemento <context:component-scan>?

http://silvioluiz.wordpress.com
[Email] [MSN]
Claudio Nazzari
Debugger
[Avatar]

Membro desde: 18/07/2006 09:59:56
Mensagens: 57
Offline

jgbt wrote:Pergunta:
O seu banco suporta transações?

[]´s


Olha, eu acho que sim haha !
Estou usando HSQLDB e Porsgresql e em ambos nao esta funcionando. Busquei na internet e os dois bancos suportam transação.

-------------------------
Claudio Nazzari
clanazzari@gmail.com
[Email] [MSN]
Claudio Nazzari
Debugger
[Avatar]

Membro desde: 18/07/2006 09:59:56
Mensagens: 57
Offline

legionarioba wrote:A documentação do Spring sugere o uso da anotação @Transactional nas classes concretas:

Spring recommends that you only annotate concrete classes (and methods of concrete classes)
with the @Transactional annotation, as opposed to annotating interfaces. You certainly
can place the @Transactional annotation on an interface (or an interface method), but
this works only as you would expect it to if you are using interface-based proxies. The fact
that annotations are not inherited means that if you are using class-based proxies
(proxy-target-class="true") or the weaving-based aspect (mode="aspectj"),
then the transaction settings are not recognized by the proxying and weaving infrastructure,
and the object will not be wrapped in a transactional proxy, which would be decidedly bad.


Spring Documentation - Part IV (Data Access) - 10.5 Declarative transaction management - Using @Transactional

Outra coisa, sua classe está no base-package que você definiu no elemento <context:component-scan>?


O component-scan esta correto, ate porque o sistema esta funcionando normalmente. O Problema é que ele esta com "autocommit" nos inserts e nao esta fazendo rollback nas exeptions, ou seja, a transaction esta sendo ingorada. Mesmo com o @Transaction no Impl


-------------------------
Claudio Nazzari
clanazzari@gmail.com
[Email] [MSN]
legionarioba
JavaTeenager
[Avatar]

Membro desde: 24/03/2003 00:40:42
Mensagens: 171
Localização: Salvador
Offline

Auto-commit no banco? Dê uma olhada no log, mas que eu lembre, mesmo que seu banco esteja configurado assim, o Transaction Manager do Spring desabilita o mesmo. Se eu conseguir gerar um log te confirmo, mas isso não seria de fato empecilho pra que o rollback seja efetuado... Copie o log gerado pelo Spring pra operação que você está tentando executar pra analisarmos aqui...

http://silvioluiz.wordpress.com
[Email] [MSN]
Claudio Nazzari
Debugger
[Avatar]

Membro desde: 18/07/2006 09:59:56
Mensagens: 57
Offline

legionarioba wrote:Auto-commit no banco? Dê uma olhada no log, mas que eu lembre, mesmo que seu banco esteja configurado assim, o Transaction Manager do Spring desabilita o mesmo. Se eu conseguir gerar um log te confirmo, mas isso não seria de fato empecilho pra que o rollback seja efetuado... Copie o log gerado pelo Spring pra operação que você está tentando executar pra analisarmos aqui...


Opa, obrigado pela ajuda.

Na verdade o "autocomit" foi apenas exemplificando. A propriedade do hibernate esta com autocomit = false mesmo...
Aqui estou testando da seguinte maneira:

1- Debugo o codigo logo apos a chamada do metodo "create" e verifico se, antes de retornar o metodo, o registro foi gravado. Neste caso esta gravando antes de retornar.
2- Forço uma exception na minha DAO e lanço como MulunguException, o que deveria fazer o rollback dos registros inseridos, o que tambem nao ocorre.

Obrigado!

-------------------------
Claudio Nazzari
clanazzari@gmail.com
[Email] [MSN]
Claudio Nazzari
Debugger
[Avatar]

Membro desde: 18/07/2006 09:59:56
Mensagens: 57
Offline

legionarioba wrote:Auto-commit no banco? Dê uma olhada no log, mas que eu lembre, mesmo que seu banco esteja configurado assim, o Transaction Manager do Spring desabilita o mesmo. Se eu conseguir gerar um log te confirmo, mas isso não seria de fato empecilho pra que o rollback seja efetuado... Copie o log gerado pelo Spring pra operação que você está tentando executar pra analisarmos aqui...


O Log que esta gerando é de sucesso, ele consegue inserir mas não tem como regra comitar apenas no final


-------------------------
Claudio Nazzari
clanazzari@gmail.com
[Email] [MSN]
legionarioba
JavaTeenager
[Avatar]

Membro desde: 24/03/2003 00:40:42
Mensagens: 171
Localização: Salvador
Offline

Esse é o log do Hibernate. Tenta colocar o log do Spring, ele vai mostrar o momento em que a transação está sendo aberta, quando a conexão JDBC é criada, quando acontece commit, rollback etc..deve ajudar..

http://silvioluiz.wordpress.com
[Email] [MSN]
Claudio Nazzari
Debugger
[Avatar]

Membro desde: 18/07/2006 09:59:56
Mensagens: 57
Offline

legionarioba wrote:Esse é o log do Hibernate. Tenta colocar o log do Spring, ele vai mostrar o momento em que a transação está sendo aberta, quando a conexão JDBC é criada, quando acontece commit, rollback etc..deve ajudar..


This message was edited 1 time. Last update was at 15/10/2009 15:49:43


-------------------------
Claudio Nazzari
clanazzari@gmail.com
[Email] [MSN]
legionarioba
JavaTeenager
[Avatar]

Membro desde: 24/03/2003 00:40:42
Mensagens: 171
Localização: Salvador
Offline

Claudio Nazzari wrote:
legionarioba wrote:Esse é o log do Hibernate. Tenta colocar o log do Spring, ele vai mostrar o momento em que a transação está sendo aberta, quando a conexão JDBC é criada, quando acontece commit, rollback etc..deve ajudar..




Tente mandar o log no momento em que você invoca a operação que deveria gerar o rollback...

http://silvioluiz.wordpress.com
[Email] [MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team