Help - Spring + Hibernate +Transaction

3 respostas
fabioebner

Amigos, estou com um problema em relacao a transacoes utilizando o Spring + Hibenate

Eu tenho 2 metodos anotados da seguinte forma:

o metodo 1 chama o metodo 2,

logo o seguindo metodo PRECISA de uma conexao, e pega a do metodo 1, porem o metodo 2 da um throw, ele me retorna o seguinte erro:

pelo que eu entendi que pq o primeiro metodo esta setado como rollback-only, mas como eu faco para arrumar isso?? nao posso tirar o REQUIRED(requer 1 transação caso nao tenha cria uma) do meu 2 metodo, pq ele pode ser tanto chamado separadamente como dentro do metodo 1, e quando for chamado pelo metodo 1 e der algum erro na hora de salvar, o que estou salvando no metodo 1 tbm nao podde ser salvo.

alguem pode me ajudar?? nao descobri como resolver isso ainda.

obrigado

3 Respostas

heatcold

Infelizmente, não consegui entender direito sua pergunta, entretanto, tenho usado o controle de transações do spring
e funciona sem problema.

o que tenho feito é anotar o serviço e não os métodos.
por exemplo:

@Service("service") @Transactional(rollbackFor = { Exception.class }) class Service { @Autowired private DAO dao; public void methodA() {} public void methodB() {} // getters and setters }
Veja se resolve seu problema!

fabioebner

Entao o meu problema e que eu possuo metodos diferenciados na parte de conexao, alguns precisam de um conexao, outros nao. voce anotando no servico, voce nao fica preso nessa situacao??

exemplo:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class }) 
metodo 1

@Transactional(propagation = Propagation.MANDATORY , rollbackFor = { Exception.class }) metodo2
entendeu??

o meu prolema e qdo eu tenho 2 metodos, de 2 servicos diferentes e os dois anotados como REQUIRED,

o metodo 1 da classe 1 chama o metodo 2 da classe 2, se eu der uma exception no meu metodo 2, ele tem que dar um rollback no que eu salvei no metodo 2 e tambem dar rollback no que eu salvei no metodo 1

ai que eu estou tendo o problema…

entendeu?

heatcold

entendi. e realmente nunca testei esse caso

na realidade, eu não acredito que seja uma boa abordagem ter um serviço chamando o outro.
justamente para evitar esse tipo de situação em que você se encontra.

por que não implementa toda a sua transação, de forma atomica, em apenas um método do serviço?
claro que nada impede que esse método chame diversos outros metodos do mesmo serviço

também não seria problema ter mais de DAO injetado no mesmo serviço

Criado 26 de janeiro de 2012
Ultima resposta 26 de jan. de 2012
Respostas 3
Participantes 2