[Resolvido] Problemas com Hibernate - Problemas ao Listar
9 respostas
FabioNoth
Boa noite pessoal, estou com problemas para resolver problemas um problema de relacionamento.
Tenho um Paciente que possui muitas Triagens.
O primeiro problema foi que não consegui listar todas as triagens de um determinado paciênte.
(Acredito que deva ser por que estão nulos ou não existem)
Obs:
Não sei se é o correto :roll:
Mais estou por o paciente de um JPanel para outro JPanel via contrutor.
Também estou com problemas para inserir uma nova Triagem em um determinado Paciente.
Segue o erro:
failed to lazily initialize a collection of role: br.com.anglo.Clinica.model.Paciente.triagem, no session or session was closed
Resolvi postar o código aqui para ver se ajuda em algo!
Classe Paciente
@EntitypublicclassPaciente{@Id@GeneratedValueprivateLongid;@ColumnprivateStringprofissão;@ColumnprivateStringstatus;...@OneToManyprivateList<Triagem>triagem;//gets and sets}
Classe Triagem
publicclassTriagem{@Id@GeneratedValueprivateLongid;@ColumnprivateStringproblema;@ColumnprivateStringquandoAconteceu;@ColumnprivateStringfezCirurgiaQuando;@ColumnprivateStringestaCaminhando;...//sets and gets}
publicclassPacienteService{List<Paciente>pacientes;List<Triagem>triagens;publicList<Paciente>getAllPacientes(){Pacientep=newPaciente();GenericDao<Paciente>dao=newGenericDao<Paciente>(p);pacientes=dao.listar("FROM Paciente");returnpacientes;}publicvoiddeletePaciente(Pacientep){GenericDao<Paciente>dao=newGenericDao<Paciente>(p);dao.deletar();}publicvoidadicionarPaciente(Pacientep){GenericDao<Paciente>dao=newGenericDao<Paciente>(p);dao.gravar();}publicvoidatualizaPaciente(Pacientep){GenericDao<Paciente>dao=newGenericDao<Paciente>(p);dao.atualizar();}publicList<Paciente>buscaPaciente(Stringnome){Sessionsession=HibernateUtil.getSessionFactory().openSession();Queryq=session.createQuery("SELECT p FROM "+Paciente.class.getName()+" as p WHERE p.nome like :nome");q.setParameter("nome",nome);List<Paciente>lista=q.list();session.close();returnlista;}publicvoideditPaciente(Pacientep){GenericDao<Paciente>dao=newGenericDao<Paciente>(p);dao.atualizar();}/*Aqui acho que tem uma gambiarra! Pois estou tentando pegar todas as triagens de um determinado paciênteNão sei se esta corretoTentei simplismente dar um getTriagem e não funcionou! :( */publicList<Triagem>getTriagens(Pacientep){Triagemt=newTriagem();GenericDao<Triagem>dao=newGenericDao<Triagem>();triagens=dao.listar("FROM Triagem");List<Triagem>lista=newArrayList<Triagem>();for(inti=0;i<triagens.size();i++){if(p==triagens.get(i).getPaciente()){lista.add(triagens.get(i));}}returnlista;}}
Também estou tentando adicionar uma nova triagem e não consigo :!:
AnjoVingador
Failed to lazily initialize a collection acontece pois os relacionamentos @OneToMany são por default Lazy e se vc quiser trazer a coleção referente aquele objeto vc terá que manter a sessão aberta ou mudar de Lasy para Eager já trazendo tudo de uma vez só, ficando assim:
Mas isso pode impactar na performance.
FabioNoth
Opa… Obrigado AnjoVingador
Consegui resolver aqui. Mais criei um service específico para este método!
Acho que não é o melhor geito! Mais resolve por enquanto!
Em relação a salvar você pode colocar assim:
Você pode escolher o melhor CascadeType para seu modelo podendo escolher entre “CascadeType.PERSIST, CascadeType.MERGE, CascadeType.ALL, CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.DETACH”.
Assim você vai autorizar o hibernate a salvar as Triagens também.
OBS:Do modo que coloquei não sei se atende seu modelo, por isso expus todos os tipos.
FabioNoth
Opa.
Valeu… Funcionou aqui… só que ainda sim estou tento problemas para listar!
Não aparece nada referente a triagem de um paciente!
Estou utilizando
SET<triagem>
Peguei de referencia em outros posts
FabioNoth
AnjoVingador
Então, consegui atualizar tudo direito sem fazer gambiarra!
Só que infelizmente não to conseguindo listar utilizando;
Set<Triagem> triagens
Não sei como fazer isso!
AnjoVingador
FabioNoth:
AnjoVingador
Então, consegui atualizar tudo direito sem fazer gambiarra!
Só que infelizmente não to conseguindo listar utilizando;
Set<Triagem> triagens
Não sei como fazer isso!
Quer relacionamento bidirecional ou unidirecional?
Unidirecional esse tópico pode ajudar link
Agora se for bidirecional vc pode colocar assim na classe Paciente:
Muito Obrigado AnjoVingador!
Vai ai uma música pelo agradecimento!
Funcionou Legal!
De nada cara,que bom que pude ajudar, nestes últimos meses eu aprendi bastante sobre o hibernate.
É sempre bom partilhar o conhecimento.
Fique com Deus.