Singleton do Hibernate+Struts

bem… achei esta classe:
http://www.guj.com.br/projeto/arquitetura/hibernate.html

mas ela não está adaptada para o struts… ou seja…
não está usando o plugin…
alguém sabe como adaptar???
eu tentei isso, mas tah dando NullPointerException:


/*
 * HibernateSessionFactory.java
 *
 * Created on 30 de Janeiro de 2005, 01:13
 */

package fotolog.controller;

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
/**
 *
 * @author Realm
 */
/**
 * Encapsula a criação de sessões para o Hibernate.
 * Utiliza uma política ThreadLocal para fornecer as sessões.
 *
 * @author Paulo Silveira
 */
public class HibernateSessionFactory {
	private static HibernateSessionFactory instance;
	private SessionFactory sessionFactory;
	private LocalSessionManager sessionManager = new LocalSessionManager();
	
	/**
	 * 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;
	}
	
       
	/**
	 * Construtor privado para o singleton
	 * 
	 * @throws IOException
	 * @throws HibernateException
	 */
	private HibernateSessionFactory(Object sf) throws HibernateException {
		Configuration cfg = new Configuration();
		cfg.addClass(fotolog.model.Comentario.class);
		cfg.addClass(fotolog.model.Confirmacao.class);
		cfg.addClass(fotolog.model.Favorito.class);
		cfg.addClass(fotolog.model.Foto.class);
		cfg.addClass(fotolog.model.Preferencia.class);
                cfg.addClass(fotolog.model.Usuario.class);
                
                if(sf == null) {
                    this.sessionFactory = (SessionFactory)sf;
                } else {
                    this.sessionFactory = cfg.buildSessionFactory();
                }
	}  
        
	/**
	 * Acesso ao singleton
	 * @return o singleton desta classe
	 */	
	public static HibernateSessionFactory getFactory() {
		if (instance == null) {
			try {
				instance = new HibernateSessionFactory(null);
			}
			catch (Exception e) {
				e.printStackTrace(System.err);
				throw new RuntimeException("problems while instantiating the singleton", e);
			}
		}
		return instance;
	}

	/**
	 * Acesso ao singleton
	 * @return o singleton desta classe
	 */	
	public static HibernateSessionFactory getFactory(Object sf) {
		if (instance == null) {
			try {
				instance = new HibernateSessionFactory(sf);
			}
			catch (Exception e) {
				e.printStackTrace(System.err);
				throw new RuntimeException("problems while instantiating the singleton", e);
			}
		}
		return instance;
	}        
        
	/**
	 * Classe utilizada para cuidar das sessões do hibernate, de uma maneira local a cada Thread.
	 * Isto é, cada Thread usa apenas uma sessão.
	 * @todo tirar essa classe do interior?
	 * @author Paulo Silveira
	 */	
	protected class LocalSessionManager extends ThreadLocal {
		
		/**
		 * Devolve o valor inicial que deve ser dado a uma Thread quando 
		 * ela pedir uma Session. No nosso caso, esse valor nunca muda, é sempre
		 * a mesma sessão para a mesma Thread.
		 */
		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;
		}
	}
}

como vc esta fazendo?

bem, eu publiquei a classe acima com um erro:

                if(sf == null) {
                    this.sessionFactory = (SessionFactory)sf;
                } else {
                    this.sessionFactory = cfg.buildSessionFactory();
                }

seria isto na verdade:

                if(sf != null) {
                    this.sessionFactory = (SessionFactory)sf;
                } else {
                    this.sessionFactory = cfg.buildSessionFactory();
                }

estou usando da seguinte maneira…
criei uma classe Connection, que manipula a Session
passada pela classe HibernateSessionFactory (no 1º post) que usa Singleton.

a classe Connection, pega a Session, executa flush(), close(),
e tambem é responsável por passar a Session para uma classe
que manipula as operações de insert, update, select… de cada tabela.
Existe uma classe para cada tabela. De acordo com o pattern DAO.

o que acontece é o seguinte… em cada servlet, arquivo jsp ou classe
do struts que utiliza a conexão com o banco… eu abro a conexão,
e executo o método session.close() no final da classe.

Mas com o singleton, não posso dar o close, já que ele garante que eu não possa criar outra conexão… ou seja, uma vez fechada, não é possível mais abrir. Mas o hibernate avisa para fechar a conexão, então como farei isto?!

Lembrando q é um sistema WEB!