Fechando a sessao do hibernate usando DAO

Boa tarde galera !

Estou implementando o uso do DAO+Hibernate ! porem eu nenhum dos artigos que eu li a sessao do hibernate é fechada.

Por exemplo… nesse artigo o DAO recebe a sessao mas eu nenhum momento ele fecha
http://www.hibernate.org/328.html

O problema de naum fechar a sessao é porque esta me ocasionando o seguinte erro:
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

Eu tentei fechar a conexao e tb tive um problema:
ERROR LazyInitializationException:19 - failed to lazily initialize a collection of role: br.com.icontrol.model.persistence.to.Users.roles - no session or session was closed

Por favor… alguem sabe quando devo fechar a sessao do hibernate, ou se é necessario fechar a sessao ? No codigo abaixo o erro acontece no metodo updateUser

Desde já… muito Obrigado.
Obs.: Eu naum postei a implementacao do DAO, pois usei o dao citado no artigo da pagina do hibernate !

public class UsersBean extends Bean{
	
	private static Logger logger = Util.startLogger(UsersBean.class);
	private ListDataModel usersList = null;
	private ArrayDataModel userRoles = null;
	private ListDataModel roles = null;
	private Users userSelected = null;

         /**
	 * Coleta as regras de acesso do usuario 
	 * @return
	 */
	public ArrayDataModel getUserRoles() {
		logger.debug("Carregando regras de acesso do usuario");
		userRoles = new ArrayDataModel(userSelected.getRoles().toArray());
		logger.debug("Regras do usuario carregado");
		HibernateUtility.closeSession();
		return userRoles;
	}

         /**
	 * Coleta todas as regras de acesso
	 * @return
	 */
	public ListDataModel getRoles() {
		logger.debug("Carregando todas as regras de acesso");
		UserBO UserBO = new UserBO();
		roles = new ListDataModel(UserBO.listRoles());
		return roles;
	}

         /**
	 * Atualiza regras do usuario selecionado
	 * @return
	 */
         public String confirmUserRoles(){
		logger.debug("Atualizando regras do usuário: " +userSelected.getLogin());
		List rolesSelected = (List)roles.getWrappedData();
		userSelected.setRoles(new HashSet<Roles>(0));
		
		for(int i = 0; i < rolesSelected.size(); i++){
			Roles role = (Roles)rolesSelected.get(i);
			if(role.isMarked()){
				logger.debug("Adicionando regra: " +role.getRole());
				userSelected.getRoles().add(role);
			}
		}
		
		new UserBO().updateUser(userSelected);
		return null;
	}
}



public class UserBO {

	public List listRoles(){
		DAOFactory daoFactory = DAOFactory.getDAOFactory(1);
		RolesDAO rolesDAO = daoFactory.getRolesDAO();
		
		HibernateUtility.beginTransaction();
		List roles = rolesDAO.list(Roles.class);
		HibernateUtility.commitTransaction();
		
		logger.debug("Lista de regras carregada");
		return roles;
	}
	public void updateUser(Users user){
		DAOFactory daoFactory = DAOFactory.getDAOFactory(1);
		UsersDAO userDAO = daoFactory.getUsersDAO();
		
		HibernateUtility.beginTransaction();
		userDAO.makePersistent(user);
		HibernateUtility.commitTransaction();
		
		logger.debug("Usuario atualizado");
	}
}

Galera… eu editei o post anterior e adicionei aonde estou fechando a sessao do hibernate !

HibernateUtility.closeSession();

Não acho que isso seja correto, pois essa tarefa acabou ficando a cargo do cliente !

Alguem por favor tem uma solução ?

Desde já… muito obrigado !