[résolu] Hibernate Annotations et oneToMany EAGER

Hibernate Annotations et oneToMany EAGER [résolu] - Java - Programmation

Marsh Posté le 04-11-2008 à 11:06:08    

Edit final : Problème résolu avec les dernières versions de Spring, Hibernate et Hibernate-annotations. Je suppose donc un bug corrigé. mais le problème est toujours là en passant pas la requête telle qu'écrit plus bas, alors qu'en passant pas hibernateTemplate de Spring, le soucis est résolu. Spring ajoute  

Code :
  1. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)


Je m'en vais donc relire la doc de Hibernate...
 
problème initial :
y a un truc que je comprends pas avec JPA là. J'ai ses deux classes :
 

Code :
  1. @Table(name = "address_book" )
  2. public class AddressBook implements Serializable {
  3.  
  4.     private static final long serialVersionUID = 4136348580478451825L;
  5.  
  6.     @Id
  7.     private Long id;
  8.  
  9.     @Column
  10.     private String name;
  11.     
  12.     @OneToMany(fetch=FetchType.EAGER)
  13.     @JoinColumn(name="address_book_id" )
  14.     private Set<Contact> contacts = new HashSet<Contact>();
  15.     
  16.     (get/set blabla...)
  17.  
  18.     @Override
  19.     public int hashCode() {
  20.         final int prime = 31;
  21.         int result = 1;
  22.         result = prime * result + (int) (id ^ (id >>> 32));
  23.         return result;
  24.     }
  25.  
  26.     @Override
  27.     public boolean equals(Object obj) {
  28.         if (this == obj)
  29.             return true;
  30.         if (obj == null)
  31.             return false;
  32.         if (getClass() != obj.getClass())
  33.             return false;
  34.         AddressBook other = (AddressBook) obj;
  35.         if (id != other.id)
  36.             return false;
  37.         return true;
  38.     }
  39.  
  40. }


et

Code :
  1. public class Contact implements Serializable {
  2.     private static final long serialVersionUID = 1L;
  3.     
  4.     @Id
  5.     private Long id;
  6.     
  7.     @Column
  8.     private String name;
  9.     
  10.     @Column
  11.     private String email;
  12.     
  13.     (get/set blabla...)
  14.  
  15.     @Override
  16.     public boolean equals(Object obj) {
  17.         if (this == obj)
  18.             return true;
  19.         if ((obj == null) || (obj.getClass() != this.getClass()))
  20.             return false;
  21.         Contact contact = (Contact) obj;
  22.         return (name == contact.name || (name != null && name
  23.                 .equals(contact.name)));
  24.     }
  25.  
  26.     @Override
  27.     public int hashCode() {
  28.         int hash = 7;
  29.         hash = 31 * hash + name.hashCode();
  30.         return hash;
  31.     }
  32.  
  33. }


 
Quand je fais cette requête :

Code :
  1. List list = getSession().createCriteria(AddressBook.class).list();


 
la liste contient autant d'AddressBook que j'ai de Contact, mais ce sont les mêmes instances de AddressBook qui sont répétées.
En clair, j'ai en base deux AddressBooks, le premier avec 2 Contacts, le second avec 3 Contacts. Et la liste rendu par HHH contient deux fois le premier AddressBook, et trois fois le second.
 
On dirait que l'ID de AddressBook n'est pas prise en compte. [:transparency]  
 
C'est la première fois que je joue avec JPA/Hibernate Annotations, si ça pue, merci de me flammer.
 
edit: alléger le code pour avoir que l'essentiel dans le post, c'est pas trop con finalement.
 
re-edit: Ça devient métaphysique. Si le FetchType est LAZY, ça fonctionne, je me retrouve avec juste deux AddressBooks dans la liste. Sauf que je veux pas que ce soit en LAZY, mais bien en EAGER, donc je voudrais comprendre


Message édité par brisssou le 04-11-2008 à 12:40:27

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-11-2008 à 11:06:08   

Reply

Marsh Posté le 04-11-2008 à 12:40:42    

résolu


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed