[Resolvido] Problemas com Hibernate - Problemas ao Listar
9 respostas
F
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 :!:
A
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.
F
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.
F
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
F
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!
A
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.