boa tarde pessoal, ja estou a dias com este problema e ainda não consegui uma solução, atravez do livro EJB 3 in action obtive a informação que ao anotar minha excessão personalizada com
@ApplicationException(rollback = true) meu minha exceção executaria um rollback na aplicação porém não obtive exito, vou postar o código.
@ApplicationException(rollback = true)
public class BusinessException extends Exception {
public BusinessException() {
}
public BusinessException(Throwable cause) {
super(cause);
}
public BusinessException(String mens) {
super(mens);
}
}
private synchronized void atualizaEstoque(String acao) throws BusinessException, EJBException, Exception {
for (MovItensMovimentacaoProdutos movItensMovimentacaoProdutos : listaItens) {
//CadProdutosServicos produto = produtosServicosSession.getById(movItensMovimentacaoProdutos.getCadProdutosServicos().getPrdtsCodigo());
CadProdutosServicos produto = movItensMovimentacaoProdutos.getCadProdutosServicos();
Integer novaQuantidade = 0;
if (acao.equals("S")) {
if (movItensMovimentacaoProdutos.getItnsmvmntcprdtsQuantidade() > produto.getPrdtsEstoque()) {
throw new BusinessException("A quantidade excede o valor em estoque.");
}
//tira o total da movimentação do estoque
novaQuantidade = produto.getPrdtsEstoque() - movItensMovimentacaoProdutos.getItnsmvmntcprdtsQuantidade();
} else {
novaQuantidade = produto.getPrdtsEstoque() + movItensMovimentacaoProdutos.getItnsmvmntcprdtsQuantidade();
}
produto.setPrdtsEstoque(novaQuantidade);
try {
//atualiza o produto com o novo estoque
produtosServicosSession.salvar(produto);
} catch (EJBException ex) {
throw ex;
} catch (Exception ex) {
throw ex;
}
}
}
bem estou fazendo testes na segunda interação, ou seja a primeira é satisfeita e o produto é atualizado com a nova quantidade de estoque, já na segunda interação minha validação de negocios estoura um BusinessException,
porém ao sair do método a minha primeira ação é feita no banco quando na verdade era pra ser “desfeita”…
segue meu ejb.
@EJB
private ProdutosServicosSessionLocal produtosServicosSession;
@Local
public interface ProdutosServicosSessionLocal extends BaseSessionLocal<CadProdutosServicos> {
}
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ProdutosServicosSession extends BaseSession<CadProdutosServicos> implements ProdutosServicosSessionLocal {
@PersistenceContext
private EntityManager em;
public CadProdutosServicos salvar(CadProdutosServicos objeto) throws EJBException {
CadProdutosServicos entity = em.merge(objeto);
em.flush();
return entity;
}
}