Fazer rollback em EJB CMT

2 respostas
R

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

}

2 Respostas

Hebert_Coelho

Disso aqui você não precisa: @TransactionManagement(TransactionManagementType.CONTAINER), pois já é o valor default.

Se você quer que o container dê o rollback você precisa estourar o erro e nunca tratá-lo.

Ou seja, onde o método é invocado, você precisa mandar um throw new BusinessException(“erro”);

Com isso, o container irá realizar o rollback. Se quem estiver chamando o método atualizaEstoque estiver dentro do pacote EJB e capturar a chamado em um try/catch, não irá rolar rollback normalmente.

R

ta ai um problema, minha regra esta fazendo a verificação no meu Managed Bean, o ejb é apenas o método que chama o.

Criado 23 de janeiro de 2012
Ultima resposta 23 de jan. de 2012
Respostas 2
Participantes 2