Tratamento de exceções no hibernate

6 respostas
R

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?

public void salvar(Object objeto)
			throws InfrastructureException {

		try {
			HibernateUtil.getSession().saveOrUpdate(objeto);
		} catch (HibernateException ex) {
			throw new InfrastructureException(ex);
		}
	}

	public void excluir(Object objeto)
			throws InfrastructureException {

		try {
			HibernateUtil.getSession().delete(objeto);
		} catch (HibernateException ex) {
			throw new InfrastructureException(ex);
		}
	}

public class InfrastructureException
	extends RuntimeException {

	public InfrastructureException() {
	}

	public InfrastructureException(String message) {
		super(message);
	}

	public InfrastructureException(String message, Throwable cause) {
		super(message, cause);
	}

	public InfrastructureException(Throwable cause) {
		super(cause);
	}
}

6 Respostas

R

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?

try { HibernateUtil.getSession().saveOrUpdate(objeto); } catch (HibernateException ex) { throw new InfrastructureException(ex); }

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

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 (HibernateException ex) {
  	throw new InfrastructureException( "Erro ao tentar salvar o objeto." );
}

E do outro lado:

try {
    dao.salvar( new Object() );
} catch( InfrastructureException ex ) {
    System.out.println( ex.getMessage() ); // imprime 'erro ao tentar .. etc '
}
R

Oi, fiz isso:

try{ HibernateUtil.salvar( cliente ); } catch (InfrastructureException ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "Erro ao salvar", JOptionPane.ERROR_MESSAGE); }

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

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”

Criado 28 de abril de 2005
Ultima resposta 28 de abr. de 2005
Respostas 6
Participantes 2