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
Desde já agradeço a a atenção… Sem mais…
Abraços!
Resolvi postar o código aqui para ver se ajuda em algo!
Classe Paciente
@Entity
public class Paciente{
@Id
@GeneratedValue
private Long id;
@Column
private String profissão;
@Column
private String status;
.
.
.
@OneToMany
private List<Triagem> triagem;
//gets and sets
}
Classe Triagem
public class Triagem {
@Id
@GeneratedValue
private Long id;
@Column
private String problema;
@Column
private String quandoAconteceu;
@Column
private String fezCirurgiaQuando;
@Column
private String estaCaminhando;
.
.
.
//sets and gets
}
DAO Genérico
public class GenericDao<T> {
private T t;
public GenericDao() {
}
public GenericDao(T t) {
this.t = t;
}
public void gravar() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.save(t);
tr.commit();
session.close();
}
public void deletar() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.delete(t);
tr.commit();
session.close();
}
public void atualizar() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.update(t);
tr.commit();
session.close();
}
@SuppressWarnings("unchecked")
public List<T> listar(String hql) {
List<T> lista = new ArrayList<T>();
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
lista = session.createQuery(hql).list();
session.close();
return lista;
}
Paciênte Service
public class PacienteService {
List<Paciente> pacientes;
List<Triagem> triagens;
public List<Paciente> getAllPacientes() {
Paciente p = new Paciente();
GenericDao<Paciente> dao = new GenericDao<Paciente>(p);
pacientes = dao.listar("FROM Paciente");
return pacientes;
}
public void deletePaciente(Paciente p){
GenericDao<Paciente> dao = new GenericDao<Paciente>(p);
dao.deletar();
}
public void adicionarPaciente(Paciente p){
GenericDao<Paciente> dao = new GenericDao<Paciente>(p);
dao.gravar();
}
public void atualizaPaciente(Paciente p){
GenericDao<Paciente> dao = new GenericDao<Paciente>(p);
dao.atualizar();
}
public List<Paciente> buscaPaciente(String nome){
Session session = HibernateUtil.getSessionFactory().openSession();
Query q = 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();
return lista;
}
public void editPaciente(Paciente p){
GenericDao<Paciente> dao = new GenericDao<Paciente>(p);
dao.atualizar();
}
/*
Aqui acho que tem uma gambiarra!
Pois estou tentando pegar todas as triagens de um determinado paciênte
Não sei se esta correto
Tentei simplismente dar um getTriagem e não funcionou! :(
*/
public List<Triagem> getTriagens(Paciente p){
Triagem t = new Triagem();
GenericDao<Triagem> dao = new GenericDao<Triagem>();
triagens = dao.listar("FROM Triagem");
List<Triagem> lista = new ArrayList<Triagem>();
for(int i=0; i<triagens.size(); i++){
if(p == triagens.get(i).getPaciente()){
lista.add(triagens.get(i));
}
}
return lista;
}
}
Também estou tentando adicionar uma nova triagem e não consigo :!:
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.
Opa… Obrigado AnjoVingador
Consegui resolver aqui. Mais criei um service específico para este método!
public void atualizaPacienteComTriagemNovo(Paciente p, Triagem t){
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.update(p);
session.save(t);
tr.commit();
session.close();
}
Acho que não é o melhor geito! Mais resolve por enquanto!
[quote=FabioNoth]Opa… Obrigado AnjoVingador
Consegui resolver aqui. Mais criei um service específico para este método!
public void atualizaPacienteComTriagemNovo(Paciente p, Triagem t){
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.update(p);
session.save(t);
tr.commit();
session.close();
}
Acho que não é o melhor geito! Mais resolve por enquanto![/quote]
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.
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
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! 
[quote=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!
[/quote]
Quer relacionamento bidirecional ou unidirecional?
Unidirecional esse tópico pode ajudar link
Agora se for bidirecional vc pode colocar assim na classe Paciente:
@OneToMany(mappedBy = "paciente", fetch = FetchType.EAGER, cascade= {CascadeType.PERSIST, CascadeType.MERGE})
E assim na classe Triagem:
@ManyToOne
@JoinColumn(name="<Aqui vai o nome da coluna que representa o ID do Paciente>")
private Paciente paciente
Muito Obrigado AnjoVingador!
Vai ai uma música pelo agradecimento!
[youtube]http://www.youtube.com/watch?v=hSTivVclQQ0[/youtube]
Funcionou Legal!
[quote=FabioNoth]Muito Obrigado AnjoVingador!
Vai ai uma música pelo agradecimento!
Funcionou Legal! [/quote]
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.