Transações EJB3

3 respostas
contrabando

E ae galera, vcs podem me ajudar nisso? :?:
Eu tenho um projeto(versão beta) que tem alguns metodos gravando no normal, o controle de transações é feito pelo conteiner, mas agora tenho outro método que utiliza alguns desses outros métodos(vou tentar mostrar o que to fazendo abaixo:

metodoA(Objeto obj)  throws Exception {
   try {
      //validações
      entityManager.persist(objEntity);
   } catch (RuntimeException re) {
      re.printStackTrace();            
      throw new Exception("Não foi possível concluir a operação");
   }
}

metodoB(Objeto obj)  throws Exception {
   try {
      //validações
      metodoA( obj.getObjFilho() );
      // suponhamos que aqui foi lançada uma exceção
      entityManager.persist(objEntity);
   } catch (RuntimeException re) {
      re.printStackTrace();            
      throw new Exception("Não foi possível concluir a operação");
   }
}

no caso não deveria gravar nada, mas, quando vou olhar no banco ele gravou o primeiro objeto

como devo proceder?
tem como eu controlar a transação só nesse método?
e deixar os outros como estão?
estão dizendo ou fazendo alguma besteira?
Valew

3 Respostas

Anderson_Schmidt

Hail!

Amigo, caso típico de controle transacional. Não implementei ainda … mas acredito que a solução ideal, seguinte padrões, seja esta:

http://www.guj.com.br/java.tutorial.artigo.182.1.guj

Flws!

Cocota

Cara,

Eu acho que este tutorial acima não vai te ajudar a resolver/entender seu problema. Você precisa da teoria das transações, que pode ser vista no PDF abaixo:

http://www.argonavis.com.br/cursos/java/j530/j530_12_Transactions.pdf

Cole aqui neste tópico, a parte das transações do ejb-jar.xml
Precisamos ver se a transação lá, está setada como Suported, NotSuported, Required, Mandatory… etc.

A

Opa, contrabando!

Olha soh cara, o EJB3 tem uma classa chamada EntityTransaction, que você pode configurar pra dar um rollback no caso de uma exceção - ou de qualquer outro problema que você considere. Vou te dar um exemplo completo que funcionou comigo:

package hellojpa;

import javax.persistence.*;
import javax.persistence.Persistence;

public class Main {
    
    public static void main(String[] args) {
        
        Cliente cliente = new Cliente();
        cliente.setNome("Thyago");
        Carro carro1 = new Carro();
        carro1.setMarca("Fiat");
        Carro carro2 = new Carro();
        carro2.setMarca("Honda");
        cliente.setCarros(carro1);
        cliente.setCarros(carro2);
        carro1.setCliente(cliente);
        carro2.setCliente(cliente);
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hellojpa");
        EntityManager em = emf.createEntityManager();
        EntityTransaction trans = em.getTransaction();
        trans.begin();
        try {
            em.persist(carro1);
            em.persist(carro2);
            em.persist(cliente);
            trans.commit();
        } catch (Exception e) {
            trans.rollback();
        }
    }
    
}

Espero ter ajudado!

Criado 28 de setembro de 2006
Ultima resposta 9 de out. de 2006
Respostas 3
Participantes 4