Transação Hibernate

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

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

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) ?

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)

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.

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

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

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.