Boa tarde.
Estou com problema ao abrir coleções para exibir dados em um JTable:
Tenho uma classe Organizacao, que possui uma coleção de Diretoria e cada uma possui uma coleção de Dirigente. 1-Monstro o cadastro principal (Organizacao), 2-listo as diretorias (List) ao selecionar uma diretoria 3-listo os dirigentes (List). O problema ocorre na etapa 3. Se eu usar Fetch = EAGER em Diretoria.dirigentes, dá erro informando que a sessão está fechada, se eu usar LAZY simplesmente não abre a tela. Em Organizacao.diretorias já uso LAZY.
Alguém sabe como resolver?
Procure por LazyLoadException e Open Session que tu vais entender o que acontece e encontrar as melhores formas de solucionar teu problema.
Ok, encontrado o problema, o motivo e que busco as organizações e após fecho a sessão. O erro ocorre ao abrir algum registro para edição ou consulta detalhada, o Hibernate tenta usar a mesma sessão para buscar as diretorias e dirigentes, porém a mesma já está fechada. Sem fechar a sessão o erro não ocorre.
Agora outra dúvida: como resolver isso? Acho que não tem porque deixar a conexão aberta. Então, uma sugestão que me vem a cabeça é ao invés de carregar o cadastro pelo objeto selecionado na JTable criar uma nova instancia do mesmo na tela de alteração. O que acham?
[quote=marcio_teixeira]Boa tarde.
Estou com problema ao abrir coleções para exibir dados em um JTable:
Tenho uma classe Organizacao, que possui uma coleção de Diretoria e cada uma possui uma coleção de Dirigente. 1-Monstro o cadastro principal (Organizacao), 2-listo as diretorias (List) ao selecionar uma diretoria 3-listo os dirigentes (List). O problema ocorre na etapa 3. Se eu usar Fetch = EAGER em Diretoria.dirigentes, dá erro informando que a sessão está fechada, se eu usar LAZY simplesmente não abre a tela. Em Organizacao.diretorias já uso LAZY.
Alguém sabe como resolver?[/quote]
antes de chamar diretoria.getDirigentes para obter a lista dos dirigentes com a sessão nova, de um merge no seu objeto diretoria. Assim ele vai estar sendo gerenciado pelo hibernate novamente e quando você chamar o getter vai ser feita a query e o resultado vai vir preenchido para você.
Deixa eu ver se entendi: seleciono o registro na JTable, passo a organizacao como parâmetro para a outra tela (até aqui fical igual antes), pego a sessão da nova tela e faço um merge na organização. É isso?
uma gambi que pode funcionar:
[code]Organizacao org = new Organizacao();
org.getDiretorias().size();
objeto.meuMetodo(org);[/code]
dentro do metodo meuMetodo a lista diretorias do objeto Organizacao vai estar carregada mesmo a sessao ja fechada.