Estou desenvolvendo uma aplicação web no hibernate e fiquei com algumas dúvidas.
Estou usando um factory para buscar a sessão de dados, porém:
Ao entrar no sistema pelo navegador, e alterar um objeto da sessão sem persistir ele (comitar a sessão), se eu abrir outro navegador com outro usuário os dados já aparecem alterados para o outro usuário.
Eu imagino que o factory da sessão esteja retornando a mesma sessão sempre.
Pergunta: Como resolver isto? Qual melhor maneira?
A sua Session está estática, por isso está usando a mesma toda hora. A SessionFactory você pode deixar estática, mas a Session deve ser criada e controlada durante o uso. Um exemplo:
Certo, não tinha nem percebido isto.
Agora me deu um erro dizendo que o objeto ja estava sendo utilizado em outra sessão aberta.
Qual o procedimento correto que devo utilizar? Por exemplo, salvando em um CRUD, eu abro a sessão, salvo, comito e fecho a sessão (vide abaixo)…
Na verdade ainda tenho algumas duvidas quanto as melhores praticas…
Por exemplo, agora esta dando um erro dizendo que não consegue inicializar o proxy ao acessar o atributo de um objeto que foi carregado pela sessão ja fechada… vide codigo…
public void tableItemClick(ItemClickEvent event) {
if (event.getItemId() != null) {
Object vo = null;
try {
Session session = HibernateUtil.getSession();
vo = session.load(voType, (Long) event.getItemId());
session.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
if (vo != null) {
try {
BaseCrudWindow crud = (BaseCrudWindow) crudWindowType.newInstance();
crud.setVo(vo);
crud.votoform(vo);
crud.setOpener(getWindow());
getWindow().getParent().getWindow().addWindow(crud);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
O erro ocorre na linha 15, quando a view vai acessar os atributos do objeto carregado da base.
Qual seria a melhor pratica?
Abrir uma sessão ao iniciar a tela e controlar a sessão ao fechar a tela?
Colocar o close() mais ao final do método?
Não utilizar o lazy?