Bonjour à tous,

Je rencontre un problème auquel je ne trouve pas de solution dans la doc d'Hibernate.

Je vais essayer d'être le plus clair possible.
Disons que j'ai 3 classes.

La première :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
public class Piece{
int id;
List composants;
}
La deuxième:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
public class Composant{
int id;
Article article;
Piece piece;
}
La dernière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
public class Article{
int id;
String nom;
}
Le mapping des relations est le suivant:

Pièce<->Composant
Dans piece.hbm.xml:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
        <list name="composants" table="COMPOSANT" inverse ="false">
            <key column="ID_PIECE" />
            <index column="PSN" />
            <one-to-many class="production.Composant" />
        </list>
Dans composant.hbm.xml:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
        <many-to-one name="piece" class="production.Piece"
            update="false" insert="false" fetch="select">
            <column name="ID_PIECE" precision="10" scale="0" not-null="true" />
        </many-to-one>
Composant -> Article:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
        <many-to-one name="article" class="production.Article"
            update="false" insert="false" fetch="select">
            <column name="ID_ARTICLE" precision="10" scale="0"
            not-null="true" />
        </many-to-one>
Je souhaite récupérer un certains nombre de pieces depuis une requête basée sur l'API Criteria.
Le code ressemble à ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
Criteria crit = session.createCriteria(Piece.Class);
crit.addRestrictions...
 
crit.setFetchMode("composants",FetchMode.JOIN);
crit.setFetchMode("composants.article",FetchMode.JOIN);
 
List ret = crit.list();
Le problème est que ma liste ret contient des doublons d'instances de Piece.
En fait, il y'a autant d'entrées que de Composants liés au pièces retournées.
Par exemple si toutes mes pièces ont 2 composants, alors il y'aura 1 doublon pour chacune des pièces.
Pourtant, chacune des pièces est bien chargée. J'arrive parfaitement à faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
Piece p = (Piece)ret.get(0);
p.getComposants.get(0);
p.getComposants.get(1);
...
Auriez-vous une solution pour éviter les doublons?

Merci d'avance!