[Hibernate] PersistentBag só se atualiza se eu fechar e reabrir a sessão

Boa noite,

Tenho um objeto Cliente que tem uma propriedade List listaVinculo. Quando eu exibo a página de alterar, a displaytag mostra a lista normalmente. Se eu salvar, e entrar na página de alterar novamente, a lista vem vazia. Vou colocar algum código que eu julguei relevante abaixo, para ajudar.

ClienteDao.java

public class ClienteDao {

	private static final ClienteDao INSTANCIA = new ClienteDao();

	private Session session;

	private ClienteDao() {
		session = HibernateSessionFactory.getSession(); 
	}

	/**
	 * Obtém a única instância disponível da classe.
	 * 
	 * @return ClienteDao - A única instância disponível da classe.
	 */
	public static ClienteDao getInstancia() {
		return INSTANCIA;
	}

	/**
	 * Inclui um Cliente no Banco de dados.
	 * 
	 * @param cliente - Objeto com os dados do Cliente.
	 */
	public void incluirCliente(Cliente cliente) {
		session.beginTransaction();
		session.save(cliente);
		session.getTransaction().commit();
	}

	/**
	 * Atualiza os dados de um Cliente no Banco de dados.
	 * 
	 * @param cliente - Objeto com os dados do Cliente.
	 */
	public void alterarCliente(Cliente cliente) {
		session.beginTransaction();
		session.merge(cliente);
		session.getTransaction().commit();
	}

	/**
	 * Exclui um Cliente no Banco de dados.
	 * 
	 * @param cliente - Objeto com os dados do Cliente.
	 */
	public void excluirCliente(Cliente cliente) {
		session.beginTransaction();
		session.delete(cliente);
		session.getTransaction().commit();
	}

	/**
	 * Obtém um Cliente pelo seu CPF.
	 * 
	 * @param cpf - O CPF do Cliente.
	 * 
	 * @return Cliente - Objeto com os dados do Cliente.
	 */
	public Cliente getCliente(String cpf) {
		return (Cliente) session.load(Cliente.class, cpf);
	}

	/**
	 * Verifica se um Cliente já está na base de dados, usando o seu CPF.
	 * 
	 * @param cpf - O CPF do Cliente.
	 * 
	 * @return boolean
	 */
	public boolean verificarClienteExistente(String cpf) {
		return (session.get(Cliente.class, cpf) != null);
	}

	protected void finalize() throws Throwable {
		session.flush();
		session.close();
		super.finalize();
	}
}

(Já tentei trocar pelo session.get, mas o resultado é o mesmo).

Os dados do cliente vem ok, só a lista que fica vazia. Aproveito para perguntar se meu método finalize() foi a maneira mais correta para fechar a sessão do hibernate quando eu não precisar mais.

*** EDITADO ***

Obtive algum progresso, mas não ficou como eu queria. Antes eu fechava a sessão do hibernate a cada chamada no Dao, mas quando eu mudei para que ele sempre usasse a mesma sessão que ele passou a não carregar a lista de VinculoProfissional a partir da segunda chamada no dao. Fiz esse teste inserindo o código abaixo no método alterarCliente(Cliente cliente):

	public void alterarCliente(Cliente cliente) {
		session.beginTransaction();
		session.merge(cliente);
		session.getTransaction().commit();
		session.flush();

		session.close();
		session = HibernateSessionFactory.getSession();
	}

Fechei a sessão e reabri a cada chamada ao método alterar e retirei o Lazy Loading da Lista, mas não está perfeito. Eu queria poder usar o lazy loading e a mesma sessão em todas as chamadas. Alguém tem uma sugestão?

Alguma ajuda?