Gente!
Eu tenho uma tabela ProdEst (id_prod e id_estacao). Criei uma função (que segundo meu teste está dando certinho) que, ao se passar como parâmetro o id_prod…me retorna todas as ocorrências de id_estacao para este id_prod. Utilizo o Hibernate.
//este método está dentro de uma classe ProdEstDAO.java
public java.util.List filtra_prod(int id_prod) {
java.util.List list_produto_est = null;
try{
Session sessao = HibernateUtil.currentSession();
Transaction transacao = sessao.beginTransaction();
Produto pp = (Produto)sessao.get(Produto.class,id_prod);
Iterator ite = pp.getestacoes().iterator();
while(ite.hasNext()){
Estacao est= (Estacao) ite.next();
list_produto_est.add(est);
}
transacao.commit();
sessao.close();
}catch(Exception ex) {
ex.printStackTrace();
return null;
}
return list_produto_est;
}
Esta lista contém os registros do BD que eu quero. Agora como eu faço para exibir o conteúdo dela? O id_prod vai ser o parametro que eu passei mesmo…mas e o id_estacao, como faço para exibir? sendo que eu não get/ser para minha tabela de ligação ProdEst.
Tentei rodar o código abaixo para teste, compilou certinho:
ProdEstDAO ProdEstDAO = new ProdEstDAO();
List lista = new ArrayList();
lista = ProdEstDAO.filtra_prod(1001);
for (int x=0; x<lista.size(); x++)
{
Estacao est = (Estacao)lista.iterator().next();
System.out.println(est.getId_estacao());
System.out.print("1001");
System.out.print(x);
System.out.println(lista.get(x));
}
olhe a mensagem que dá ao rodar:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
java.lang.NullPointerException
at inpe.dsa.bdi.dao.ProdEstDAO.filtra_prod(ProdEstDAO.java:135)
at inpe.dsa.bdi.vo.teste.main(teste.java:47)
Exception in thread “main” java.lang.NullPointerException
at inpe.dsa.bdi.vo.teste.main(teste.java:49)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
PQ NAO IMPRIMIU O CONTEÚDO DOS MEUS SYSTEM.OUT ?
Qual a melhor forma de eu exibir as ocorrencias de estacao para este prod? O Jaireilton me deu um exemplo legal, mas vindo de uma LISTA, como eu estou usando, não estou sabendo empregar…
VALEU
Corrigindo algumas coisinhas:
[code]public List filtra_prod(int id_prod) {
try{
Session sessao = HibernateUtil.currentSession();
Transaction transacao = sessao.beginTransaction();
Produto pp = (Produto)sessao.get(Produto.class,id_prod);
transacao.commit();
sessao.close();
return pp.getEstacoes();
}catch(Exception ex) {
ex.printStackTrace();
return null;
}
}[/code]
[code]ProdEstDAO ProdEstDAO = new ProdEstDAO();
List lista = ProdEstDAO.filtra_prod(1001);
Iterator ite = lista.iterator();
while(ite.hasNext(){
Estacao est = (Estacao) ite.next();
System.out.println(est.getId_estacao());
System.out.print("1001");
}[/code]
veja se ajuda…
Fiz exatamente o que vc falou: somente alterando o meu dao para Set ao inves de List, já que pp.getestacoes() vai retornar um Set.
O erro agora mudou qdo eu testo…olhe:
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
compile-single:
run-main:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread “main” org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: inpe.dsa.bdi.vo.Produto.estacoes, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:138)
at inpe.dsa.bdi.vo.teste.main(teste.java:83)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
Ele diz sucesso mas continua nao me exibindo o valor dos System.out
Ressalto: Quando rodo sem chamar o DAO ( o código do DAO eu coloco neste main de teste), dá certinho. Mas eu necessito utilizar o DAO, eu[b] tenho que resgatar a lista (o set) de um objeto DAO (dao.filtra_prod())…
O problema é que sua coleção está mapeada como lazy instantiation, isso faz com que o Hibernate não busque os elementos da coleção imediatamente, mas quando você tentar acessar a coleção, o problema é que quando você tenta acessar a coleção, a sessão já está fechada…
A solução seria tirar esse lazy instantiation do mapeamento…
Dê uma olhada no mapeamento da coleção “estacoes”, veja se tem um lazy=“true” lá, e coloque false…
OK! Deu certo! Mas o meu lazy já estava false…o problema era no DAO…o sessao.close() estava antes do return, pq o return tinha q estar fora do try. Eu armazenei pp.getestacoes() em uma variavel Set antes do close…e assim dei o return desta variavel Set…!
valeu…
agora vou passar isto pra JSP
qq dúvida eu posto pra encher o seu saco de novo…rssrrsrs
até