Dificuldade com capturar excessão ao atualizar JPA + EJB

5 respostas
R

boa tarde pessoal, estou trabalhando EJB + JPA em uma aplicação EAR, e estou com o seguinte problema, na minha estrutura ao salvar o objeto caso receba qualquer excessão meu session bean lança uma exception e eu a capturo normalmente no meu managed bean, fazendo o teste com duplicate key, salvar funcionou 100% mas ao atualizar a excessão não é capturada e é estourada na view segue os trechos do código…

session bean

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EstadosSession implements EstadosSessionLocal {

   @PersistenceContext
    private EntityManager em;


public T salvar(CadEstado estado) throws EJBException{
        return em.merge(estado);
    }

...
}

managed bean

@Named(value = "mbCadEstado")
@ViewScoped
public class MbCadEstado implements Serializable {

    @EJB
    private EstadosSessionLocal estadosSession;

@Inject
    private CadEstado beanEstado;

    public CadEstado getBeanEstado() {
        return beanEstado;
    }

    public void setBeanEstado(CadEstado beanEstado) {
        this.beanEstado = beanEstado;
    }

public void salvar() {
        try {
            estadosSession.salvar(this.getBeanEstado());
            contexto.adicionaMensagemInfo("Salvo com Sucesso");
            this.limpar();
        } 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 (Exception ex) {
            contexto.adicionaMensagemErro("Erro: " + ex.getMessage());
        }

    }

}

segue a exception…

java.lang.IllegalStateException: Could not commit transaction
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.commitOrRollback(TransactionPhaseListener.java:122)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.commitOrRollback(TransactionPhaseListener.java:101)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.handleTransactionsAfterPhase(TransactionPhaseListener.java:79)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.afterPhase(TransactionPhaseListener.java:56)
	at org.jboss.seam.faces.event.DelegatingPhaseListener.afterPhase(DelegatingPhaseListener.java:36)
	at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:189)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:107)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at br.com.usinaweb.aplicacao.filtros.AutenticacaoSistema.doFilter(AutenticacaoSistema.java:64)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.transaction.RollbackException: Transaction marked for rollback.
	at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:473)
	at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:852)
	at com.sun.enterprise.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:208)
	at org.jboss.seam.transaction.UTTransaction.commit(UTTransaction.java:68)
	at org.jboss.seam.transaction.DefaultSeamTransaction.commit(DefaultSeamTransaction.java:107)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.commitOrRollback(TransactionPhaseListener.java:109)
	... 38 more
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
	at org.hibernate.ejb.AbstractEntityManagerImpl$3.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1068)
	at org.hibernate.transaction.synchronization.CallbackCoordinator.beforeCompletion(CallbackCoordinator.java:122)
	at org.hibernate.transaction.synchronization.HibernateSynchronizationImpl.beforeCompletion(HibernateSynchronizationImpl.java:51)
	at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435)
	... 43 more
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	at org.hibernate.transaction.synchronization.CallbackCoordinator.beforeCompletion(CallbackCoordinator.java:117)
	... 45 more
Caused by: java.sql.BatchUpdateException: Duplicate entry 'GO' for key 'estd_sigla'
	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)
	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 52 more

5 Respostas

drsmachado

Isso deveria te dizer alguma coisa

Caused by: java.sql.BatchUpdateException: Duplicate entry 'GO' for key 'estd_sigla'

Basicamente, a coluna estd_sigla tem uma constraint para valor único e, por algum moteivo, o JPA está interpretando tua solicitação não como update, mas como insert.

maior_abandonado

provavelmente está ocorrendo alguma exceção não verificada.

depois do catch para Exception coloca outro catch para Throwable.

R

não eu forçei tentar essa coluna com uma ja cadastrada em outro campo, ele executou sim o update o problema foi que não passou nos meus catchs…

@maior_abandonado
tentei adicionar o novo catch e continua não sendo executado…

R

bom dia, acabei de encontrar o aparente motivo para não conseguir capturar a excessão, porém não sei como trata-lo.
quando meu método é executado no “salvar” o jpa dispara o insert naquele momento, por isso se der excetion ele cai no catch.
agora no atualizar, ao passar pelo merge o jpa não faz nada ele processa todo o método volta ao managed bean, e conclui o método apenas no final ele dispara o update do jpa,
dai a exception é lançada na tela.

Alguem tem alguma sugestão de como tratar? e se é possivel pedir para o update ser lançado nakele momento???

R

o problema foi resolvido com o flush ele executa o comando no momento que o flush é chamado agora aos mais experientes no assunto é o correto a se fazer???

Criado 28 de setembro de 2011
Ultima resposta 29 de set. de 2011
Respostas 5
Participantes 3