Quando eu trabalhava em delphi, se acontecia algum erro, ele sempre era mostrado em uma janela ao usuário. Gostaria de acontecesse o mesmo nesse meu primeiro programa em java. Como eu devo fazer?
No exemplo de código abaixo tem um tratamento de exceções em bloco try - catch. Eu sempre devo fazer como nesses exemplos toda vez ao salvar ou deletar objetos?
Fiz um teste inserindo um valor duplicado em uma tabela que tem restrição de unique key. O resultado foi esse abaixo, que apareceu no console de saída.
Que diferença fez o código de salvar estar entre bloco try nesse caso?
Hibernate: insert into CLIENTE (VERSAO, nome, CLIENTE_ID) values (?, ?, ?)
10:53:34,92210:53:34,92210:53:34,932org.hibernate.exception.GenericJDBCException: could not insert: [src.model.Cliente]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1882)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2214)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:675)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:293)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at src.model.HibernateUtil.Salvar(HibernateUtil.java:46)
at src.model.GerenciadorCliente.Salvar(GerenciadorCliente.java:15)
at src.controller.ControladorTelaPesquisaCliente$5.actionPerformed(ControladorTelaPesquisaCliente.java:77)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1766)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "UK_CLIENTE_NOME" on table "CLIENTE"
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:503)
at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:144)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:98)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1866)
... 37 more
Exception in thread "AWT-EventQueue-0" src.exceptions.InfrastructureException: org.hibernate.exception.GenericJDBCException: could not insert: [src.model.Cliente]
at src.model.HibernateUtil.Salvar(HibernateUtil.java:48)
at src.model.GerenciadorCliente.Salvar(GerenciadorCliente.java:15)
at src.controller.ControladorTelaPesquisaCliente$5.actionPerformed(ControladorTelaPesquisaCliente.java:77)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1766)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [src.model.Cliente]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1882)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2214)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:675)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:293)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at src.model.HibernateUtil.Salvar(HibernateUtil.java:46)
... 26 more
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "UK_CLIENTE_NOME" on table "CLIENTE"
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:503)
at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:144)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:98)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1866)
... 37 more
_fs
Já que você só lançou outra exceção, não faz diferença nenhuma já que seu objetivo é mostrar a exceção para o usuário.
Você pode tratar a exceção numa camada mais próxima à interface.
E outra cara, está comçando com Java e já quer usar Hibernate?
R
ronaldorezende
Sim, os frameworks open source de persistencia de objetos foram uma das coisas que me mais me atrairam no java. Se fosse pra trabalhar sem eles, eu ficava no delphi mesmo.
Apesar de estar no meu primeiro programa java, eu já leio sobre java e tecnologias relacionadas a alguns anos.
Não estou completamente perdido não, só perco um pouco de tempo em algumas coisas que tenho que fazer pela primeira vez.
Nesse caso dessa exceção, fiquei em dúvida, pois vi isso em um exemplo do livro Hibernate in Action.
Nesse caso, foi gerado várias linhas de erro na saída padrão. Tinha como eu pegar apenas a mensagem para mostrar para o usuário?
Tem como eu pegar em algum lugar as mensagens de erro já traduzidas? Ex:
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint “UK_CLIENTE_NOME” on table “CLIENTE”
Como vocês costumam tratar isso? Vocês mesmo traduzem ou já usam alguma classe que faz isso? Ou mostram a mensagem em inglês para o usuário?
_fs
Para pegar só a mensagem da exceção, use Exception.getMessage();
Para ter uma exceção com mensagem “personalizada”, poderia fazer:
try{HibernateUtil.getSession().saveOrUpdate(objeto);}catch(HibernateExceptionex){thrownewInfrastructureException("Erro ao tentar salvar o objeto.");}
E do outro lado:
try{dao.salvar(newObject());}catch(InfrastructureExceptionex){System.out.println(ex.getMessage());// imprime 'erro ao tentar .. etc '}
Acho que essa classe InfrastructureException então não serviu para nada no meu código, vou tirar ela. Não sei qual foi a intenção do autor ao incluí-la no exemplo.
R
ronaldorezende
Como faço para pegar a exceção FBSQLException?
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint “UK_CLIENTE_NOME” on table “CLIENTE”