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 :
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 :
@Table(name = "address_book" ) private static final long serialVersionUID = 4136348580478451825L; @Id @Column @OneToMany(fetch=FetchType.EAGER) @JoinColumn(name="address_book_id" ) private Set<Contact> contacts = new HashSet<Contact>(); (get/set blabla...) @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (int) (id ^ (id >>> 32)); return result; } @Override public boolean equals (Object obj ) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; AddressBook other = (AddressBook) obj; if (id != other.id) return false; return true; } }
|
et
Code :
private static final long serialVersionUID = 1L; @Id @Column @Column (get/set blabla...) @Override public boolean equals (Object obj ) { if (this == obj) return true; if ((obj == null) || (obj.getClass() != this.getClass())) return false; Contact contact = (Contact) obj; return (name == contact.name || (name != null && name .equals(contact.name))); } @Override public int hashCode() { int hash = 7; hash = 31 * hash + name.hashCode(); return hash; } }
|
Quand je fais cette requête :
Code :
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.
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