Erro com rollback em Ejb3.1

8 respostas
R

bom dia pessoal, estou implementando utilizando transações gerenciadas pelo container (CMT) porém dentro do meu MB, após uma inserção dentro da transação corrente do método chamo uma exception que criei e anotada com @ApplicationException(rollback = true), porém o rollback não é executado segue as partes do código.

//chamada da Exception dentro de um método do Mb.

if (this.caixaAberto().equals(Boolean.FALSE)) {
      throw new BusinessException("Favor abrir o caixa");
}
//Código da Exception
@ApplicationException(rollback = true)
public class BusinessException extends Exception {
    
    public BusinessException() {
    }
    
    public BusinessException(Throwable cause) {
        super(cause);
    }
    
    public BusinessException(String mens) {
        super(mens);
    }
}

8 Respostas

dev.rafael

Por favor, poste o restante do código que está com problemas.

R

segue o código

try {
                FinTituloItens novaParcela = new FinTituloItens();
                novaParcela.setFinTitulos(this.getBeanTituloItens().getFinTitulos());
                novaParcela.setTtltnVencimento(this.getBeanTituloItens().getTtltnVencimento());
                novaParcela.setTtltnStatus("0");
                novaParcela.setTtltnNumeroParcela(this.getBeanTituloItens().getTtltnNumeroParcela());
                //calcula o valor para a nova parcela
                Money valorNovaParcela = valorAPagar.subtrair(valorPg);
                novaParcela.setTtltnValor(valorNovaParcela.getAmount());
                novaParcela.setTtltnObservacao("Gerado devido a baixa parcial refêrente a parcela Nº " + this.getBeanTituloItens().getTtltnNumeroParcela());
                //salva a nova parcela
                tituloItensSession.salvar(novaParcela);

                if (this.caixaAberto().equals(Boolean.FALSE)) {
                  throw new BusinessException("Favor abrir o caixa");
               }

            //fluxo de caixa
            FinFluxoCaixa beanFluxoCaixa = new FinFluxoCaixa();
            beanFluxoCaixa.setFinCaixa(this.getCaixa());
            beanFluxoCaixa.setFinTitulosItensFormasPagamento(beanItensFormasPagamento);
            beanFluxoCaixa.setFlxcxData(Calendar.getInstance().getTime());
            beanFluxoCaixa.setFlxcxTipo(tipoMovimentacao);
            beanFluxoCaixa.setFlxcxValor(valorPago);
            beanFluxoCaixa.setFlxcxStatus("1");
            fluxoCaixaSession.salvar(beanFluxoCaixa);


               this.getBeanTituloItens().setTtltnStatus("1");
               //atualiza a parcela
               tituloItensSession.salvar(this.getBeanTituloItens());
      } catch (EJBException ex) {
            LastException lastException = new LastException();
            Throwable th = lastException.findLastException(ex);
            if (th instanceof SQLException) {
                contexto.adicionaMensagemErro(new DatabaseException((SQLException) th).getMessage());
            } else {
                contexto.adicionaMensagemErro(th.getMessage());
            }
        } catch (BusinessException ex) {
            contexto.adicionaMensagemErro("Erro: " + ex.getMessage());
        } catch (Exception ex) {
            contexto.adicionaMensagemErro("Erro: " + ex.getMessage());
        }

o código entra na exception passada a seguir normalmente, porém o primeiro insert antes da verificação não é dado o rollback...

dev.rafael

Qual é o tipo desse “tituloItensSession”?
Como está declarado o @TransactionAttribute do seu EJB?

R

@TransactionManagement(TransactionManagementType.CONTAINER) @TransactionAttribute(TransactionAttributeType.REQUIRED)

dev.rafael

Ainda preciso saber qual é o tipo desse “tituloItensSession” e como ele está declarado no seu EJB. Caso ele seja outro EJB eu gostaria de ver as anotações nele bem como o modo como foi declarado o EntityManager que você está usando.

R

chamada

@EJB
 private TitulosSessionLocal titulosSession;

EJB

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)  
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class TitulosSession extends BaseSession<FinTitulos> implements TitulosSessionLocal {
    @PersistenceContext
    private EntityManager em;
....

}
dev.rafael

Cara agora eu estou trabalhando mas quando eu chegar em casa eu vou fazer um teste. Me diz qual versão do Glassfish você está usando?

R

to usando a glassfish-3.1.1 que vem junto com o netbeans 7.0.1

Criado 28 de novembro de 2011
Ultima resposta 28 de nov. de 2011
Respostas 8
Participantes 2