Lista com registros de uma tabela de ligação

4 respostas
M

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

4 Respostas

J

Corrigindo algumas coisinhas:

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;
   }
}
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");
}

veja se ajuda...

M

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())…

J

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…

M

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é

Criado 25 de setembro de 2006
Ultima resposta 25 de set. de 2006
Respostas 4
Participantes 2