[Resolvido!] Tratamento de Exception na exclusão de registros com dependentes

11 respostas
K

Olá pessoal, boa tarde.

Estou com um probleminha de exception, quando o usuário tenta excluir um registro que possui outros registros dependentes. Claro que, isso retorna uma exception. O que eu estou tentando é tratar essa exception com try/catch, com o throws, mas nenhum deu certo... a excessão retornada é esta:
javax.faces.FacesException: javax.el.ELException: /pages/programa/lista.xhtml @23,138 rendered="#{not empty programaHandler.programas}": Error reading 'programas' on type br.gov.rr.setrabes.handler.ProgramaHandler
	at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:373)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:880)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:594)
	at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
	at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:530)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:21)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:636)
Caused by: javax.el.ELException: /pages/programa/lista.xhtml @23,138 rendered="#{not empty programaHandler.programas}": Error reading 'programas' on type br.gov.rr.setrabes.handler.ProgramaHandler
	at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:76)
	at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:370)
	... 36 more
Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.loader.Loader.doList(Loader.java:2223)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at br.gov.rr.setrabes.dao.Dao.list(Dao.java:38)
	at br.gov.rr.setrabes.handler.ProgramaHandler.getProgramas(ProgramaHandler.java:32)
	at sun.reflect.GeneratedMethodAccessor128.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45)
	at org.apache.el.parser.AstNot.getValue(AstNot.java:42)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
	... 37 more
Caused by: org.postgresql.util.PSQLException: ERRO: transação atual foi interrompida, comandos ignorados até o fim do bloco de transação
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
	at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
	at org.hibernate.loader.Loader.doQuery(Loader.java:674)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2220)
	... 55 more
o método de exclusão é este:
public void excluir(ActionEvent event){
		try {
			System.out.println("Excluindo: " + programa.getCod_programa());
			UIComponent link = event.getComponent();
			UIParameter param = (UIParameter) link.findComponent("excluir");
			Long id = (Long) param.getValue();

			Session session = HibernateUtil.currentSession();
			Dao<Programa> programaDao = new Dao<Programa>(session,
					Programa.class);
			this.programa = programaDao.load(id);
			programaDao.delete(this.programa);
			this.programa = new Programa();
			// return "excluido";
		} catch (Exception ex) {
			statusERROR();
		}
	}

Já tentei utilizar o throws PSQLException, o SQLEXception, o ELException, o FacesException, mas nenhum destes tratou esta maldita....

se alguem puder contribuir, agradeço.

11 Respostas

K

pessoal, o erro que ele me retorna no console do eclipse é esse:

2:36:57,451 WARN JDBCExceptionReporter:77 - SQL Error: 0, SQLState: 23503 12:36:57,453 ERROR JDBCExceptionReporter:78 - Entrada em lote 0 delete from programa where cod_programa='15' foi abortada. Chame getNextException para ver a causa. 12:36:57,454 WARN JDBCExceptionReporter:77 - SQL Error: 0, SQLState: 23503 12:36:57,455 ERROR JDBCExceptionReporter:78 - ERRO: atualização ou exclusão em tabela "programa" viola restrição de chave estrangeira "fk7643c6bf26b9a8f7" em "servico" Detalhe: Chave (cod_programa)=(15) ainda é referenciada pela tabela "servico". 12:36:57,459 ERROR AbstractFlushingEventListener:301 - Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:146) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:41) at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1562) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) at br.gov.rr.setrabes.dao.Dao.list(Dao.java:38) at br.gov.rr.setrabes.handler.ProgramaHandler.getProgramas(ProgramaHandler.java:33) at sun.reflect.GeneratedMethodAccessor127.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at javax.el.BeanELResolver.getValue(BeanELResolver.java:62) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53) at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64) at org.apache.el.parser.AstValue.getValue(AstValue.java:118) at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45) at org.apache.el.parser.AstNot.getValue(AstNot.java:42) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71) at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:370) at org.richfaces.component.RenderPhaseDataScrollerVisitor.isRendered(RenderPhaseDataScrollerVisitor.java:204) at org.richfaces.component.RenderPhaseDataScrollerVisitor.beforeComponent(RenderPhaseDataScrollerVisitor.java:100) at org.richfaces.event.RenderPhaseComponentListener.processComponents(RenderPhaseComponentListener.java:47) at org.richfaces.event.RenderPhaseComponentListener.processComponents(RenderPhaseComponentListener.java:51) at org.richfaces.event.RenderPhaseComponentListener.processComponents(RenderPhaseComponentListener.java:55) at org.richfaces.event.RenderPhaseComponentListener.processComponents(RenderPhaseComponentListener.java:55) at org.richfaces.event.RenderPhaseComponentListener.beforePhase(RenderPhaseComponentListener.java:71) at org.ajax4jsf.component.AjaxViewRoot.processPhaseListeners(AjaxViewRoot.java:188) at org.ajax4jsf.component.AjaxViewRoot.encodeBegin(AjaxViewRoot.java:510) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:884) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:594) at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100) at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:530) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:21) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:636) Caused by: java.sql.BatchUpdateException: Entrada em lote 0 delete from programa where cod_programa='15' foi abortada. Chame getNextException para ver a causa. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2569) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1796) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2708) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) ... 62 more

Espero que ajude.

V

Pelo seu StackTrace, o erro está acontecendo aqui:

br.gov.rr.setrabes.dao.Dao.list(Dao.java:38)

E não no método que você está mostrando.
Talvez por isso so eu catch não esteja funcionando.

H

Ola todos,

se tiver utilizando hibernate coloque nas listas de depentes:

assim vc deleta todos os dependentes junto.

K

Hulkmarciano:
Ola todos,

se tiver utilizando hibernate coloque nas listas de depentes:

assim vc deleta todos os dependentes junto.

Olá Hulkmarciano, bom dia.

Estou usando sim o hibernate, mas não quero usar o Cascade, pois realmente não quero que seja apagado o registro com dependências, apenas quero criar a correção da exception, informando que este registro não pode ser apagado.

Mas obrigado por colaborar.

K

visola:
Pelo seu StackTrace, o erro está acontecendo aqui:

br.gov.rr.setrabes.dao.Dao.list(Dao.java:38)

E não no método que você está mostrando.
Talvez por isso so eu catch não esteja funcionando.

Olá visola, bom dia.

Não é um erro exatamente, na verdade é uma exception que foi gerada pela tentativa de apagar um registro com dependências, onde o hibernate não autoriza. Realmente, eu não quero que apague esse registro, quero apenas tratar essa exceção com uma mensagem visual.

Mesmo assim, agradeço a colaboração.

H

Blz Kleber-rr,

Vc quer tratar seu erro no: public void excluir(ActionEvent event){
Acho que ele não está capturando o erro, porque ele já esta sendo tratado internamento. Talvez na propria dao. Verifique se não tem nenhum catch dentro dos metodos que vc chama.

K

Pessoal, não sei se é o correto, mas eu tratei a exceção com o throws PSQLException no próprio método, e criei um método no dao para verificar se o registro possui rependencias ou não.
Deu certo, não sei se é a melhor maneira, mas resolveu meu problema.

Agradeço a todos, e se tiverem sugestões, agradeço.

Abs.

V

Amigão estou precisando extamete disso também.
Tem como mandar um exemplo ai?

Obrigado!

K

vinnymesquita:
Amigão estou precisando extamete disso também.
Tem como mandar um exemplo ai?

Obrigado!

eae vinny, blz?

Cara, já to de saída, mas amanhã eu posto pra vc um exemplo. Se eu me esquecer, pode me cobrar. Vlw.

V

Valeu amigão!

D

Amigo qual a solução que voce usou para esse problema?

Criado 26 de janeiro de 2011
Ultima resposta 25 de fev. de 2015
Respostas 11
Participantes 5