Hibernate2 - A coleção retorna somente um objeto!

Estou usando hibernate2 com Postgresql e quando recupero uma coleção pelo Hibernate, só aparece um objeto. No banco estão todos os três que eu inseri! Estou preso nisso há algumas semanas…

meu mapeamento xml

<hibernate-mapping> 
   <class name="SubEspecialidade" table="SubEspecialidade" > 
       <id name="idSubEspecialidade" type="int" > 
          <generator class="increment" /> 
       </id> 
      <property name="nome" type="string"/>       
      <many-to-one 
         name="especialidade" 
         class="Especialidade" 
         column="idespecialidade" 
         not-null="true" 
      />        
   </class> 

   <class 
       name="Especialidade" 
       table="Especialidade" 
   > 
       <id 
           name="idEspecialidade" 
           type="integer" 
           column="idEspecialidade" 
       > 
           <generator class="increment" /> 
       </id> 
      <property name="nome" type="string"/> 
      <property name="qtdRetorno" type="integer"/> 
      <property name="qtdDiaControleVaga" type="integer"/> 
       
      <set name="subEspecialidades" 
          table="subespecialidade" 
          cascade="all" 
          inverse="true" 
          lazy="true" 
      > 
         <key column="idsubespecialidade" /> 
         <one-to-many class="SubEspecialidade" />       
      </set>           
   </class> 
    
</hibernate-mapping> 

As classes estão ai, com seus getter e setter, esse não é o problema. O Hibernate não lança nenhuma excessão ou inserir ou recuperar do banco, simplesmente só mostra a primeira SubEspecialidade inserida!

Minhas classes

public class Especialidade { 
   private Integer idEspecialidade; 
   private String nome; 
   private int qtdRetorno; 
   private int qtdDiaControleVaga; 
   private Set subEspecialidades = new HashSet(); 

   public Especialidade() { 
   } 

   public Especialidade(Integer id, String nome, int qtdRet, int qntDCV) { 

      setIdEspecialidade(id); 
      setNome(nome); 
      setQtdRetorno(qtdRet); 
      setQtdDiaControleVaga(qntDCV); 
   } 

   public Integer getIdEspecialidade() { 
      return idEspecialidade; 
   } 

   public String getNome() { 
      return nome; 
   } 

   public int getQtdDiaControleVaga() { 
      return qtdDiaControleVaga; 
   } 

   public int getQtdRetorno() { 
      return qtdRetorno; 
   } 

   public void setIdEspecialidade(Integer i) { 
      idEspecialidade = i; 
   } 

   public void setNome(String string) { 
      nome = string; 
   } 

   public void setQtdDiaControleVaga(int i) { 
      qtdDiaControleVaga = i; 
   } 

   public void setQtdRetorno(int i) { 
      qtdRetorno = i; 
   } 

   public boolean equals(Object obj) { 

      if (this == obj) 
         return true; 
      if (!(obj instanceof Especialidade)) 
         return false; 

      final Especialidade esp = (Especialidade) obj; 

      if (esp.getIdEspecialidade() != getIdEspecialidade()) 
         return false; 
      if (esp.getNome() != getNome()) 
         return false; 
      if (esp.getQtdDiaControleVaga() != getQtdDiaControleVaga()) 
         return false; 
      if (esp.getQtdRetorno() != getQtdRetorno()) 
         return false; 

      return true; 
   } 

   public int hashCode() { 
      return (getNome().hashCode() * 29); 
   } 

   public String toString() { 
      return "{ " 
         + getIdEspecialidade() 
         + " , " 
         + getNome().trim() 
         + " , " 
         + getQtdRetorno() 
         + " , " 
         + getQtdDiaControleVaga() 
         + " } "; 
   } 

   public Set getSubEspecialidades() { 
      return subEspecialidades; 
   } 

   public void setSubEspecialidades(Set set) { 
      subEspecialidades = set; 
   } 

   public void addSubEspecialidade(SubEspecialidade subEsp) { 
      subEspecialidades.add(subEsp); 
   } 

   public void listaSubEspecialidades() { 

      Iterator it = subEspecialidades.iterator(); 
      SubEspecialidade s; 
      int i = subEspecialidades.size(); 
      System.out.println("qnt de elementos = " + i); 
      while (it.hasNext()) { 
         s = (SubEspecialidade) it.next(); 
         System.out.println(s); 
      } 
   } 
} 
// ============================================ 

public class SubEspecialidade { 
   private Integer idSubEspecialidade; 
   private String nome; 
   private Especialidade especialidade; 

   /** 
    * 
    */ 
   public SubEspecialidade() { 
   } 

   /** 
    * 
    */ 
   public SubEspecialidade(Integer id, String nome, Especialidade esp) { 
      idSubEspecialidade = id; 
      this.nome = nome; 
      this.especialidade = esp; 
   } 

   /** 
    * @return 
    */ 
   public Integer getIdSubEspecialidade() { 
      return idSubEspecialidade; 
   } 

   /** 
    * @return 
    */ 
   public String getNome() { 
      return nome; 
   } 

   /** 
   * @param i 
   */ 
   public void setIdSubEspecialidade(Integer i) { 
      idSubEspecialidade = i; 
   } 

   /** 
    * @param string 
    */ 
   public void setNome(String string) { 
      nome = string; 
   } 

   public Especialidade getEspecialidade() { 
      return especialidade; 
   } 

   public void setEspecialidade(Especialidade especialidade) { 
      this.especialidade = especialidade; 
   } 

   public String toString() { 
      String out = " { " + getIdSubEspecialidade() + " , " + getNome().trim(); 

      if (getEspecialidade() == null) { 
         out += " , null "; 
      } else 
         out += " , " + getEspecialidade().toString(); 

      out += " } "; 
      return out; 
   } 

   public boolean equals(Object obj) { 

      if (this == obj) { 
         return true; 
      } 

      if (obj instanceof SubEspecialidade) { 
         return false; 
      } 
      final SubEspecialidade se = (SubEspecialidade) obj; 
      if (getNome().equals(se.getNome())) 
         if (getEspecialidade().equals(se.getEspecialidade())) 
            return true; 
      return false; 
   } 

   /* 
    * consultar acab para restrição no banco para UNIQUE no campo no da SubEspecialidade 
    * talvez precise ser chave-candidata!!! 
    * 
    */ 
   public int hashCode() { 
      return getNome().hashCode(); 
   } 
} 
// ============================================ 

public class EspecialidadeDao { 

   private SessionFactory factory; 

   public EspecialidadeDao() throws Exception { 
      factory = 
         new Configuration() 
            .addClass(Especialidade.class) 
            .buildSessionFactory(); 
   } 

   public void insert(Especialidade esp) throws Exception { 
      Transaction tx = null; 
      try { 
         Session session = factory.openSession(); 
         tx = session.beginTransaction(); 
         session.save(esp); 
         session.flush(); 
         tx.commit(); 
         session.close(); 
      } catch (Exception e) { 
         if (tx != null) 
            tx.rollback(); 
         throw e; 
      } 
   } 

   public java.util.List getList(String condicao) throws Exception { 
      Session session = factory.openSession(); 
      List esp = session.find(condicao); 
      session.flush(); 
      session.close(); 
      return esp; 
   } 

   public Especialidade retrieve(String pk) throws Exception { 
      try { 
         Session session = factory.openSession(); 
         Especialidade esp = 
            (Especialidade) session.load( 
               Especialidade.class, 
               new Integer(pk)); 
         session.flush(); 
         session.close(); 
         return esp; 
      } catch (ObjectNotFoundException e) { 
         return null; 
      } 
   } 
    
   public Especialidade retrieveAll(String pk) throws Exception { 
         try { 
            Session session = factory.openSession(); 
            Especialidade esp = 
               (Especialidade) session.load( 
                  Especialidade.class, 
                  new Integer(pk)); 
             
            esp.listaSubEspecialidades(); 
            session.flush(); 
            session.close(); 
            return esp; 
         } catch (ObjectNotFoundException e) { 
            return null; 
         } 
      } 

   public void delete(Especialidade esp) throws Exception { 
      Transaction tx = null; 
      try { 
         Session session = factory.openSession(); 
         tx = session.beginTransaction(); 
         session.delete(esp); 
         session.flush(); 
         tx.commit(); 
         session.close(); 
      } catch (Exception e) { 
         if (tx != null) 
            tx.rollback(); 
         throw e; 
      } 
   } 

   public void update(Especialidade esp) throws Exception { 

      Transaction tx = null; 
      try { 
         Session session = factory.openSession(); 
         tx = session.beginTransaction(); 
         session.update(esp); 
         tx.commit(); 
         session.close(); 

      } catch (Exception e) { 
         if (tx != null) 
            tx.rollback(); 
         throw e; 
      } 
   } 
} 
// ============================================ 


public class SubEspecialidadeDao{ 

   private SessionFactory factory; 

   public SubEspecialidadeDao() throws Exception{ 
      factory = new Configuration().addClass(SubEspecialidade.class).buildSessionFactory(); 
   }      

   public void insert(SubEspecialidade subEsp) throws Exception{ 
     Transaction tx = null; 
     try { 
         Session session = factory.openSession(); 
         tx = session.beginTransaction(); 
         session.save(subEsp); 
         session.flush(); 
         tx.commit(); 
         session.close(); 
        } 
     catch (Exception e) { 
      if (tx != null) 
         tx.rollback(); 
     throw e; 
         } 
   } 
    
   public java.util.List getList(String condicao) throws Exception{ 
     Session session = factory.openSession(); 
     List subEsp = session.find(condicao); 
     session.flush(); 
     session.close(); 
     return subEsp; 
   } 
    
   public SubEspecialidade retrieve(String pk) throws Exception{ 
     Session session = factory.openSession(); 
     SubEspecialidade subEsp = (SubEspecialidade) session.load(SubEspecialidade.class, new Integer(pk) ); 
     session.flush(); 
     session.close(); 
     return subEsp; 
   } 
    
   public void delete(SubEspecialidade subEsp) throws Exception{ 
   Transaction tx = null; 
     try { 
         Session session = factory.openSession(); 
         tx = session.beginTransaction(); 
         session.delete(subEsp); 
         session.flush(); 
         tx.commit(); 
         session.close(); 
        } 
     catch (Exception e) { 
      if (tx != null) 
      tx.rollback(); 
     throw e; 
   } 
   }    
    
   public void update(SubEspecialidade subEsp) throws Exception { 
       
         Transaction tx = null; 
         try{ 
            Session session = factory.openSession(); 
            tx = session.beginTransaction(); 
            session.update(subEsp); 
            tx.commit(); 
            session.close(); 
          
         }catch ( Exception e ) { 
            if(tx!= null ) 
               tx.rollback(); 
            throw e; 
         } 
      } 
} 

aplicação teste


public static void main(String[] args) throws Exception { 
      System.out.println("Entrando na Aplicação."); 

      espDao = new EspecialidadeDao(); 
      subEspDao = new SubEspecialidadeDao(); 

      try { 
          
          
         esp = new Especialidade(null , "Cirurgia", 6, 5); 
         espDao.insert(esp); 
          
         subEsp = new SubEspecialidade(null, "Cirurgia Cardíaca",esp); 
         subEspDao.insert(subEsp); 
         esp.addSubEspecialidade(subEsp); 
         espDao.update(esp); 

         subEsp = new SubEspecialidade(null, "Cirurgia Ortopédica",esp); 
         subEspDao.insert(subEsp); 
         esp.addSubEspecialidade(subEsp); 
         espDao.update(esp); 
          
         subEsp = new SubEspecialidade(null, "Cirurgia Plástica",esp); 
         subEspDao.insert(subEsp); 
         esp.addSubEspecialidade(subEsp); 
         espDao.update(esp); 
          
         esp.listaSubEspecialidades();          
          
         esp = espDao.retrieveAll("1"); 
         esp.listaSubEspecialidades();       
          
      } catch (Exception e) { 
         e.printStackTrace(); 
      } 

      System.out.println("Saindo da Aplicação."); 
   } 

Quando eu listo o Set de SubEspecialidade apenas mostra

{ 1 , Cirurgia Cardíaca , { 1 , Cirurgia , 6 , 5 } }

mas no banco diz



 idsubespecialidade | idespecialidade |              nome 
--------------------+-----------------+-------------------------------- 
                  2 |               1 | Cirurgia Ortopédica 
                  1 |               1 | Cirurgia Cardíaca 
                  3 |               1 | Cirurgia Plástica 
(3 rows) 

hospital=# select * from especialidade; 
 idespecialidade |              nome              | qtdretorno | qtddiacontrolevaga 
-----------------+--------------------------------+------------+-------------------- 
               1 | Cirurgia                       |          6 |                  5 
(1 row) 

Acho que poderia ser minha implementação de hashCode()! Li no Hibernate Reference que seria isso. Ser for, qual implementação de hashCode() eu devo usar!? Se alguém tiver algum material sobre isso…

Obrigado por qualquer ajuda,

Daniel

E aí Daniel, é seu mapeamento que está errado…

Onde vc fez isso:

      <set name="subEspecialidades" 
          table="subespecialidade" 
          cascade="all" 
          inverse="true" 
          lazy="true" 
      > 
         <key column="idsubespecialidade" /> 
         <one-to-many class="SubEspecialidade" />        
      </set>

O key Column na verdade se refere a classe que vc está mapeando (no caso Especialidade) e não à qual vc está referenciando (SubEspecialidade)…

O correto seria:

      <set name="subEspecialidades" 
          table="subespecialidade" 
          cascade="all" 
          inverse="true" 
          lazy="true" 
      > 
         <key column="idespecialidade" /> 
         <one-to-many class="SubEspecialidade" />        
      </set>

Espero ter ajudado…
Fallow

Exatamente!!! muito obrigado!!! Sou novato na coisa e isso me ajudou muito!!!

Valeu!!!