Transação Hibernate

7 respostas
J

Pessoal,

Quero criar uma classe POJO para tratar as transações, o que o EJB SessionBean faz.

como faço isso utilizando o Hibernate?

exemplo:

public void inserir(){
   //inicio da transação

   new ClienteDAO().inserir();
   new ProdutoDAO.inserir();
  
//fim da transação
//se der errado desfaça tudo
}

tem como fazer isso e como?

valeu

7 Respostas

TedLoprao

hmmm, desculpe, mas não entendi sua pergunta, vc quer saber como trabalhar com transações com o Hibernate??

Se for, basta usar a seguinte estrutura

Transaction tx = sess.beginTransaction();
// ...
tx.commit();

fallow

J

Olá Ted,

a verdade eu quero simular o que o EJB(SessionBean) faz.

no metodo do ejb chamo varios DAO e se der errado…faço ele dar roolback. só que usando EJB não posso tratar de transação nos DAO pois é incorreto quando usa o gerenciamento pelo container.

tem uma classe java e tem um metodo e nesse metodo chamo varios DAO e se der errado quero que der rollback em tudo…com faço isso usando Hibernate com SessionBean ou uma classe POJO(classe java normal) ?

_fs

Cara, com o WebWork2 pe possível fazer isso instanciando uma Transaction quando a requisição começa, e mando o commit() no fim de tudo ou um rollback caso dê algum erro.

O tchans é fazer algo parecido na sua aplicação.

Aqui um link para o exemplo disso que eu citei acima:
http://www.hibernate.org/159.html
Baixe a DemoApplication - AdminApp (Hibernate2, WebWork2, Tomcat, MySQL)

louds

Voce pode fazer a mesma coisa que um SessionBean usando um Dynamic Proxy (olhe java.lang.reflext.Proxy).

Algo como:

public TransactionalHandler implements InvocationHandler {
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Transaction tx = session.beginTransaction();
     try {
        Object r = method.invoke(sessionBean, args);
        tx.commit();
        return r;
     } catch(Throwable t) {
         tx.rollback();
         throw t;
     }
  }
}

public interface MyBeanIface { ... }
public class MyBeanImpl { ... }
...
Proxy.newInstance(loader, new Class[] { MyBeanIface.class } , new TransactionalHandler(new MyBeanImpl()));

Ops, já ia esquecendo, se for fazer para motivos que não seja aprender como fazer use um framework que tenha gerenciamento de transações, seja ele Interceptors do WebWork2, EJB ou Spring Framework. Eu recomedo fortemente o último.

TedLoprao

ah, agora entendi!
Realmente, se for pra fazer isso em produção recomendaria a utilização de algum container ou framework.
Agora outra opção para fins de teste é utilizar algo com cglib, que não te obriga a ter uma interface para utilizar o proxy!!

Fallow

J

Pessoal como seria usando EJB(SessionBean)?

Pois quando o ejb é gerenciado pelo container eu não posso fazer a transação no Hibernate e sim no metodo do SessionBean.

como seria? poderia postar exemplos.

muito grato

louds

Para usar o hibernate com CMT vc tem q colocar ele para operar com JTA…
Nunca fiz ou precisei, então não tenho como falar mais que isso.

Criado 26 de agosto de 2004
Ultima resposta 27 de ago. de 2004
Respostas 7
Participantes 4