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
}
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!!