Salvadores,
No meu sistema usando EJB 3.0 com JPA e estamos usando transação gerenciada pelo container (JTA).
Para o meu desagrado, acabei descobrindo que, se meu EJB lança uma checked exception, ou seja, uma classe que estende java.lang.Exception diretamente, ele não faz o rollback da transação.
Segundo a documentação, ela diz que para fazer o rollback automático, o EJB deve lançar uma exceção de sistema (RuntimeException).
http://java.sun.com/javaee/5/docs/tutorial/doc/bncij.html
[quote]Rolling Back a Container-Managed Transaction
There are two ways to roll back a container-managed transaction. First, if a system exception is thrown, the container will automatically roll back the transaction. Second, by invoking the setRollbackOnly method of the EJBContext interface, the bean method instructs the container to roll back the transaction. If the bean throws an application exception, the rollback is not automatic but can be initiated by a call to setRollbackOnly.[/quote]
No entanto vi que, se eu mudar mina exceção de Exception para RuntimeException, o rollback passa a funcionar.
Eu não queria fazer isto, pois minhas exceções são exceções de negócio, que deveriam ser checked exception, além do que, se eu lanço uma RuntimeException, o container fica aninhando a exceções dentro de outras (ex: EJBException), e meu mecanismo de controle de exceções fica mais complicado.
Alguém sugere algo para que eu continue a usar checked exception e que, ao ser lançada, o rollback ainda seja feito de forma automática, sem ter de chamar setRollbackOnly?
@Stateless
public class MeuEJBBean implements MeuEJB {
public class fazUmMonteDeCoisas() throws MinhaException {
// faz várias coisas, inclusive salva no BD
// dependendo de uma condição, pode lançar a MinhaException
}
}
Gracias