Codigo fonte Guj(Classe Utilitaria)

Pessoal,

Estou começando com hibernate e gostaria de saber se a melhor maneira de criar uma classe utilitaria para o hibernate seria assim com ThreadLocal e etc. uma outra coisa é se temos que fechar a “session” ou não. quando utilizamos!!

Gostaria a opinião de todos!

P.S.: Esse codigo foi retirado do codigo fonte do Guj.

public class HibernateSessionFactory 
{
  protected class LocalSessionManager extends ThreadLocal {
    protected Object initialValue() {
      Session session;
      try {
          
          session = HibernateSessionFactory.this.sessionFactory.openSession();
          }
  			catch (HibernateException e) {
  				throw new RuntimeException("Problems while opening a new thread local hibernate session", e);
  			}
  			return session;
  		}
  	}
  
  	private static HibernateSessionFactory instance;
  
  	/***
  	 * Acesso ao singleton.
  	 * 
  	 * @return o singleton desta classe
  	 */
  	public static HibernateSessionFactory getFactory() {
  		if (instance == null) {
  			try {
  				instance = new HibernateSessionFactory();
  			}
  			catch (Exception e) {
  				
  				throw new RuntimeException("problems while instantiating the singleton", e);
  			}
  		}
  		return instance;
  	}
  
  	private SessionFactory sessionFactory;
  
  	private LocalSessionManager sessionManager = new LocalSessionManager();
  
  	/***
  	 * Construtor privado para o singleton
  	 * 
  	 * @throws IOException
  	 * @throws HibernateException
  	 */
  	private HibernateSessionFactory() throws HibernateException {
  		Configuration cfg = new Configuration();
  		cfg.addClass(Cliente.class);
  		cfg.addClass(Pedido.class);
  		
  		this.sessionFactory = cfg.buildSessionFactory();
  	}
 
  	/***
  	 * Pega uma sessão do Hibernate.
  	 * Talvez essa sessão seja aberta agora, caso a Thread.currentThread() nunca tenha
  	 * pedido uma sessão ainda.
  	 * 
  	 * @return uma sessão do hibernate.
 	 */
 	public Session getSession() {
 		Session session = (Session) this.sessionManager.get();
 		return session;
 	}
 	
 	public Session getNewSession() {
 		Session session;
 		try {
 			session = this.sessionFactory.openSession();
 		}
 		catch (HibernateException e) {
 			throw new RuntimeException("Problems while opening a new hibernate session", e);
 		}
 		return session;		
 	}