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

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:

[code] 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();
	}
}[/code]

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

se alguem puder contribuir, agradeço.

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.

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.

Ola todos,

se tiver utilizando hibernate coloque nas listas de depentes:

assim vc deleta todos os dependentes junto.

[quote=Hulkmarciano]Ola todos,

se tiver utilizando hibernate coloque nas listas de depentes:

assim vc deleta todos os dependentes junto.[/quote]

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.

[quote=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.[/quote]

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.

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.

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.

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

Obrigado!

[quote=vinnymesquita]Amigão estou precisando extamete disso também.
Tem como mandar um exemplo ai?

Obrigado![/quote]

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.

Valeu amigão!

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