Hibernate inicializando toda vez

5 respostas
Thiago_G3

Olá pessoal.

Estou com um probleminha aqui… Tenho conseguido fazer insert, select e etc pelo Hibernate… Criei uma classe DAO. Só que toda hora que eu preciso inserir ou fazer um select, tenho que criar uma nova instância dessa classe, fazendo assim rodar dinovo o Hibernate, pq ele cria uma SectionFactory… Tornando o sistema meio lento, pois ele roda tudo outra vez. Estou desenvolvendo um programa desktop, então estou utilizando Swing. Utilizei um botão para cadastrar, o actionListener dele ficou assim:

cmdCadastrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
               String nome = txtNome.getText();
      String endereco = txtEndereco.getText();
      String email = txtEmail.getText();
      String celular = txtCelular.getText();
      
      Amigo novo = new Amigo();
      novo.setNome(nome);
      novo.setEndereco(endereco);
      novo.setEmail(email);
      novo.setCelular(celular);
      
      try{
         AmigoDAO n = new AmigoDAO();
         n.insert(novo);
      }catch(Exception ex){
         
      }
            }
         });

e o meu DAO está assim:

import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class AmigoDAO{

   private SessionFactory factory;

   public AmigoDAO() throws Exception{
       factory = new Configuration().addClass(Amigo.class).buildSessionFactory();
   }     

   public void insert(Amigo amigo) throws Exception{
      Session session = factory.openSession();
      //não preicsei criar uma transação pois eu setei o hibernate.properties para autocommit
      //Transaction transaction = session.beginTransaction();
      session.save(amigo);
      session.flush();
      //transaction.commit();
      session.close();
   }
   
   public java.util.List getList(String condicao) throws Exception{
      Session session = factory.openSession();    
      Criteria select = session.createCriteria(Amigo.class);
      //Query select = session.createQuery("from Amigo");
      List amigos = select.list();
      session.flush();
      session.close();
      return amigos;
   }
   
   public Amigo retrieve(String pk) throws Exception{
      Session session = factory.openSession();
      Amigo amigo = (Amigo) session.load(Amigo.class,pk);
      session.flush();
      session.close();
      return amigo;
   }
   
   public java.util.List retrieve2(String nome) throws Exception{
         Session session = factory.openSession();
         Query select = session.getNamedQuery("buscarAmigosPeloNome");
         select.setString("nome", nome);
         
         List encontrado =  select.list();
         session.flush();
         session.close();
         return encontrado;
      }
   
   public void delete(Amigo amigo) throws Exception{
      Session session = factory.openSession();
      session.delete(amigo);
      session.flush();
      session.close();
   }
}

O que fazer para não ter que ficar criando uma nova SectionFactory toda vez que efetuar um cadastro, fazer um select, etc?

Grato desde já

Thiago!

5 Respostas

rodrigo_corinthians
...
private static AmigoDAO instance = new AmigoDAO();

private AmigoDAO() throws Exception{...

public static AmigoDAO getInstance() {
 return instance;
}
...
Chamada
AmigoDAO n = AmigoDAO.getInstance();
Solução: Utilizar o Design Pattern Singleton para ter uma única instância do objeto.
Alexandre

Cuidado quando for colocar um DAO singleton, pois este se utilizar uma Session no escopo da classe…vc poderá uma hora levar uma exception, dizendo qua a Session está fechada.

A maneira que eu costumava fazer…era criar tipo uma classe utilitária de hibernate…onde ela tem um SessionFactory static…e desse session factory…vc vai pegando o current session. Thread local.

Não tenho o código aki, mas idéia é + ou - essa.

Abraço!

Alexandre_Vilas_Boas

Uso assim:

public class HibernateDAO {
	private static SessionFactory factory = null;
	private static AnnotationConfiguration cfg = null;
	private static ThreadLocal sessao = new ThreadLocal();
	private static ThreadLocal transacao = new ThreadLocal();

	public static Session getSession() {
		try {
			if (factory == null) {
				cfg = new AnnotationConfiguration();
				cfg.addAnnotatedClass(CentrosCusto.class);
				cfg.addAnnotatedClass(Cheques.class);
				cfg.addAnnotatedClass(ClassificaEntidade.class);
				cfg.addAnnotatedClass(CondicoesPgto.class);
				cfg.addAnnotatedClass(CondicoesPgtoDias.class);
				cfg.addAnnotatedClass(Contas.class);
				cfg.addAnnotatedClass(Compra.class);
				cfg.addAnnotatedClass(CompraProd.class);
				cfg.addAnnotatedClass(CompraProdAvulso.class);
				cfg.addAnnotatedClass(CompraServ.class);
				cfg.addAnnotatedClass(Contatos.class);
				cfg.addAnnotatedClass(Enderecos.class);
				cfg.addAnnotatedClass(Entidades.class);
				cfg.addAnnotatedClass(EstImpostos.class);
				cfg.addAnnotatedClass(Faturamento.class);
				cfg.addAnnotatedClass(FaturamentoItem.class);
				cfg.addAnnotatedClass(FaturamentoProd.class);
				cfg.addAnnotatedClass(FaturamentoServ.class);
				cfg.addAnnotatedClass(Feriados.class);
				cfg.addAnnotatedClass(Filiais.class);
				cfg.addAnnotatedClass(Geradores.class);
				cfg.addAnnotatedClass(Grupo.class);
				cfg.addAnnotatedClass(Impostos.class);
				cfg.addAnnotatedClass(Kardex.class);
				cfg.addAnnotatedClass(NaturezaOperacao.class);
				cfg.addAnnotatedClass(FormaPag.class);
				cfg.addAnnotatedClass(PlanoContas.class);
				cfg.addAnnotatedClass(Produtos.class);
				cfg.addAnnotatedClass(ProdutosComponente.class);
				cfg.addAnnotatedClass(RegistroNF.class);
				cfg.addAnnotatedClass(RegistroNFItem.class);
				cfg.addAnnotatedClass(RegistroNFProd.class);
				cfg.addAnnotatedClass(RegistroNFServico.class);
				cfg.addAnnotatedClass(Servicos.class);
				cfg.addAnnotatedClass(Status.class);
				cfg.addAnnotatedClass(SubGrupo.class);
				cfg.addAnnotatedClass(Titulos.class);
				cfg.addAnnotatedClass(Unidades.class);
				cfg.addAnnotatedClass(UnidadeNegocio.class);
				cfg.addAnnotatedClass(Usuarios.class);
				factory = cfg.buildSessionFactory();
			}
			if (sessao.get() == null) {
				beginTransaction();
			}
		} catch (Throwable e) {
			throw new ExceptionInInitializerError(e);
		}
		return (Session) sessao.get();
	}
	private static Transaction getTransaction() {
		return (Transaction) transacao.get();
	}
	private static void beginTransaction() {
		sessao.set(factory.openSession());
		transacao.set(getSession().beginTransaction());
	}
	private static void closeSession() {
		try {
			if (getSession() != null) {
				getSession().close();
			}
		} finally {
			sessao.set(null);
			transacao.set(null);
		}
	}
	public static void flush() {
		if (getSession() != null) {
			getSession().flush();
		}
	}
	public static void commit() {
		try {
			if (getTransaction() != null) {
				getTransaction().commit();
			}
		} finally {
			closeSession();
		}
	}
	public static void rollback() {
		try {
			if (getTransaction() != null) {
				getTransaction().rollback();
			}
		} finally {
			closeSession();
		}
	}
}
Alexandre

Legal tb é dar uma olhada na integração do Spring com o Hibernate…particularmente eu gosto.

Thiago_G3

Consegui agora… utilizando uma static… Consegui entender como fazer o procedimento das diversas maneiras! Muito obrigado a todos que me ajudaram aqui. :lol: Precisando, estamos as ordens.

Feliz natal…
:wink:

Criado 23 de dezembro de 2006
Ultima resposta 24 de dez. de 2006
Respostas 5
Participantes 4