Pessoal estou tentando capturar uma exceção de duplicidade de chaves,mas por algum motivo nao consigo executar com sucesso.Eu gostaria de saber se o modo que estou persistindo meus valores influencia neste problema?
[Resolvido]Tratando de exceções
7 Respostas
Olá amigo, para podermos te ajudar necessitamos ver seu código, para uma melhor analise.
Segue o código abaixo:
package br.com.OPT_WEB_002.empresa;
import java.util.List;
import javax.ejb.EJBTransactionRolledbackException;
import javax.persistence.PersistenceException;
import org.hibernate.*;
import org.hibernate.exception.ConstraintViolationException;
import org.hibernate.exception.JDBCConnectionException;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import br.com.OPT_WEB_002.familia_item.Familia_Item;
import br.com.OPT_WEB_002.util.DAOException;
import br.com.OPT_WEB_002.util.ExcecaoTeste;
import br.com.OPT_WEB_002.util.HibernateUtil;
public class EmpresaDAOHibernate implements EmpresaDAO {
private org.hibernate.Session session;
@Override
public void excluir(Empresa empresa) throws org.hibernate.HibernateException {
this.session.delete(empresa);
}
@Override
public void atualizar(Empresa empresa) {
this.session.merge(empresa);
}
@Override
public Empresa carregar(Integer cod_empresa) {
return (Empresa) this.session.get(Empresa.class, cod_empresa);
}
@Override
public Empresa buscar(int cod_empresa) {
String hql = "select e from Empresa e where e.cod_empresa = :cod_empresa";
Query consulta = this.session.createQuery(hql);
consulta.setInteger("cod_empresa", cod_empresa);
return (Empresa) consulta.uniqueResult();
}
@Override
public List<Empresa> listar() throws org.hibernate.HibernateException{
return this.session.createCriteria(Empresa.class).list();
}
@Override
public void salvar(Empresa empresa) throws DAOException{
try{
this.session.save(empresa);
this.session.flush();
}catch(ConstraintViolationException e){
throw new DAOException(e.getMessage());
}
}
public void setSession(org.hibernate.Session session) {
this.session = session;
}
public org.hibernate.Session getSession() {
return session;
}
}
A captura esta sendo feita no meu metodo salvar,mas a minha duvida e a seguinte,pelo exemplos que vi aqui o pessoal utiliza a session para receber um getSessionFactory depois eles utilizam varias vzs a transação usando begin session depois persistem o objeto e depois disso usam commit ou flush.Nao estou fazendo nada disso apenas um save.
Os comandos flush e commit são necessários sim, o commit e a confirmação daquele transação, o flush libera todas as transações pedentes. De uma lida nesse pequeno artigo ele vai te ajudar.
Isso vai depender de outros fatores. Você está rodando sua aplicação num web server (ex: tomcat) ou application server (ex: jboss)? Está usando EJB? Spring?
Estou usando tomcat e spring, gostaria de saber quais os melhores metodos que devo implementar quando estou salvando ou excluindo(ex:commit,close,flush).
Usando spring, você jah tem o controle transacional dele para usar (através da anotação @Transactional no método), o que evita o controle manual.
Recomendo que dê uma lida na documentação do Spring para aprender mais sobre seu controle transacional.