[Resolvido] Problemas com Hibernate - Problemas ao Listar

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. :smiley:
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&lt;Triagem&gt; triagens

Não sei como fazer isso! :frowning:

[quote=FabioNoth]AnjoVingador
Então, consegui atualizar tudo direito sem fazer gambiarra!
Só que infelizmente não to conseguindo listar utilizando;

Set&lt;Triagem&gt; triagens

Não sei como fazer isso! :frowning: [/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="&lt;Aqui vai o nome da coluna que representa o ID do Paciente&gt;")
    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.