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?