Galera,
Estava fazendo alguns testes aqui em me deparei com alguns problemas.
É o seguinte. Vou colocar uma classe qeu estou utilizando para testar.
Obs: O código não está muito bem escrito, fiz na correria para postar, sem javadoc etc.
@Stateless(name=Constantes.JNDI.EJB.CLIENTE)
public class ClienteBean implements ClienteFacade {
@Resource
private SessionContext context;
@PersistenceContext(unitName=Constantes.JNDI.Persist.VENDA)
private EntityManager entityManager;
@Override
public void add(Cliente cliente) {
entityManager.persist(cliente);
add2(cliente);
}
@Override
@TransactionAttribute(TransactionAttributeType.NEVER)
public void add2(Cliente cliente) {
entityManager.persist(new Cliente("add2"));
}
@Override
public void remove(Long id) {
}
}
Cenário:
- Se eu chamar o método add, ele chama o add2, ok.
- O método add por padrão trata a transação como REQUIRED, logo ele abre uma transação. (está gerenciada pelo container)
- O método add2 está declarado como “NEVER”, ou seja, se chegar uma com uma transação, lança uma exceção.
Resultado:
Fiz a chamada ejb do método add, porém ele chamadou o add 2 sem dar nenhum erro, inclusive conseguiu persistir.
Cenário 2:
Seu eu mudar a chamada do métod add2 que está dentro de add para:
Ele funciona conforme esperado, ou seja, lançando uma exceção dizendo que não pode ser chamado dentro de uma transação.
Imagino que o cenário 1 “não funciona” conforme esperado, porque estou fazenod uma chamada utilizando this (implicitamente), logo ele não passa pelo objeto ejb que
faz todo processo de interceptor transacional, ou seja, é um bean que está delegando para seu outro método.
Sei que são raros casos em qeu chamamos um método “exposto” dentro do próprio ejb (um metodo ejb chamar outro método do mesmo ejb)
Mas como vocês fazem nesse caso? existe um jeito menos trabalhoso de fazer isso?
Obs: Não usei ServiceLocator para fazer o lookup, era só para dar um exemplo mesmo.
Vlw