Melhor forma de fechar uma Session no Hibernate

Boa noite,

Amigos, construir meus daos no meu sistema, mas não consegui encontrar uma boa forma de fechar a Session do Hibernate. Não estou usando nenhum framework.

Vejam um exemplo:

package dao;

import infra.CriadorDeSession;

import java.util.List;

import modelo.Account;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class AccountDAO {
	
	Session session;
	Transaction tx;
	public AccountDAO(){
		session=CriadorDeSession.getSession();
		tx = session.beginTransaction();
	}

	public  void salva(Account account) {
		session.save(account);
		tx.commit();
		fecha();
	}
	
	public void remove(Account account){
		session.delete(account);
		fecha();
	}
	
	public void atualiza(Account account){
		session.update(account);
		fecha();
	
	}
	
	public Account get(Integer id){
		Account account=(Account)session.load(Account.class,id);
		fecha();return account;
	}
	
	@SuppressWarnings("unchecked")
	public List<Account> lista(){
		List<Account> list=session.createQuery("from modelo.Account").list();
		fecha();return list; 
	}
	
	public void fecha(){
		session.close();
	
	}

}

Percebam que eu criei um método para fechar a Session e sempre que termino um método do DAO chamo esse método.

O problema é que quando vou utilizar o objeto retornado do DAO numa outra classe, é lançada a exceção org.hibernate.LazyInitializationException: could not initialize proxy - no Session

Percebi que caso eu não feche a Session esse erro não ocorre.

Qual a forma mais adequada para eu trabalhar com essa session?

Agradeço

Amigo boa noite , não sei se é a forma mais adequada mais eu faço basicamente assim


public class DaoX {

	Session sessao = null;
		Transaction tx = null;
	


public void salvar(Cliente u) {
		try {
			sessao = HibernateUtil.getSession();
			tx = sessao.beginTransaction();
			sessao.save(u);
			tx.commit();
		} catch (Exception ex) {
			tx.rollback();
			ex.printStackTrace();
		} finally {
			if (sessao != null) {
				try {
					sessao.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

Perceba que eu tenho um bloco finally que mesmo que meu hibernateUtil não retorne nada por exemplo , e eu não consiga realizar meu commit
ele vai testar se a sessao é diferente de null e se for ele vai tentar fechar a mesma , acredito que somente o meu bloco que testa a exception que esta muito abstrato
difucultando um pouco a interpretação da exception .

Espero ter ajudado.

Amigo, voce poderia fazer uma classe que gerencia esse controle de transacao, mais na minha opiniao, e nao sou um expert no assunto, vc deveria usar um framework de injecao de dependencia, tipo um spring…, mais e minha opiniao…

Amigo, voce poderia fazer uh ma classe que gerencia esse controle de transacao, mais na minha opiniao, e nao sou um expert no assunto, vc deveria usar um framework de injecao de dependencia, tipo um spring…, mais e minha opiniao…

Muito obrigado worldsoft e mausexdd.

Alguém teria um exemplo da utilização de Spring nesse caso?

Vou procurar algumas coisas, e posto o que achar.

Grato

eu vi spring bem por cima , oque vi na injecao de dep lá , é que não era necessario ficar instanciando objetos , voce só passa o BackBean no xml , ele faz isto para voce , agora sobre persistencia não sei dizer, de uma olhada no Framework VRaptor parece que ele integra hibernate com Spring , ctz tem métodos e maneiras bem eficazes de realizar esses metodos com este framework