Qual a melhor maneira para trabalhar com as sessões Hibernate em aplicação Swing?
6 respostas
M
marcio_teixeira1
Bom dia.
Estou desenvolvendo um aplicação Desktop em Swing e estou tendo problemas com as sessões. A aplicação tem interface com multiplas telas (MDI). Na minha classe DAO, ao salvar, excluir ou buscar algum registro eu verifico se há uma sessão criada (variável estática), se não tiver crio e faço a operação. Após fazer a operação, o que faço com essa sessão? Não posso fechar, pois pode haver outras telas usando ela, porém se eu deixo aberta em alguns casos dá erro, principalmente em classes que possuem coleções, erro por ter mais de uma sessão ativa. Parece-me que o Hibernate abre uma sessão para buscar os objetos da coleção. Como resolver?
Bom dia marcio_teixeira, eu utilizo uma abordagem na qual emprego uma camada ‘Controller’ a qual é responsável por abrir executar a transação que necessito e finalizar minha sessão.
Por exemplo, na tela de cadastro de cliente, no método salvar, chamo uma classe ‘controller’ que abre a sessão, inicia a transação, comitta, trata rollback e fecha a transação, sei q é trabalhoso mas tem funcionado até então.
Abaixo um exemplo de um método salvar qualquer:
try {
minhaSessionFactory.open();
minhaSessionFactory.begin();
//aqui coloco a lógica que preciso para executar a operação
minhaSessionFactory.commit();
} catch(Exception){
minhaSessionFactory.rollback();
} finally {
minhaSessionFactory.closeSession();
}
Espero ter ajudado.
[]'s
M
marcio_teixeira1
Então, na verdade para cada operação (salvar, atualizar, excluir…) você cria uma nova sessão e após fecha. Isso pode ser feito, não há problema?
thiagocg
Sim pode ser feito sem problema, o custo ai fica por conta de gerenciar a session do hibernate manualmente. O que não pode ser feito é a criação de uma nova conexão com o bd (buildSessionFactory) esse sim deve ser feito apenas uma vez pois seu custo é alto.
No mais é isso!
[]'s
M
marcio_teixeira1
Ok, vou testar.
FernandoFranzini
Sem processos concorrentes
Compartilhe 1 fabrica e 1 sessão por todo o sistema.
Aplique singleton.
Com processos concorrentes
Abra 1 fabrica e cada Thread terá sua sessão própria.
Aplique Thread-Local
M
marcio_teixeira1
Ficou ok com a abertura de um nova sessão para cada operação. Resolvido.