Différence @OneToMany List <> vs Set <>

94

Y a-t-il une différence si j'utilise

@OneToMany
public Set<Rating> ratings;

ou si j'utilise

@OneToMany
public List<Rating> ratings;

les deux fonctionnent bien, je connais la différence entre une liste et un ensemble, mais je ne sais pas si cela fait une différence dans la façon dont hibernate (ou plutôt JPA 2.0) le gère.

M4ks
la source

Réponses:

109

Une liste, s'il n'y a pas de colonne d'index spécifiée, sera simplement traitée comme un sac par Hibernate (pas de classement spécifique).

Une différence notable dans la gestion d'Hibernate est que vous ne pouvez pas récupérer deux listes différentes en une seule requête. Par exemple, si vous avez une Personentité ayant une liste de contacts et une liste d'adresses, vous ne pourrez pas utiliser une seule requête pour charger des personnes avec tous leurs contacts et toutes leurs adresses. La solution dans ce cas est de faire deux requêtes (ce qui évite le produit cartésien), ou d'utiliser a Setau lieu de a Listpour au moins une des collections.

Il est souvent difficile d'utiliser des ensembles avec Hibernate lorsque vous devez définir equalset hashCodesur les entités et que vous n'avez pas de clé fonctionnelle immuable dans l'entité.

JB Nizet
la source
3
Et pour plus de détails sur ce qui se passe avec une liste, consultez stackoverflow.com/q/1995080/2495717 .
ben3000
31

Si vous utilisez une liste, vous pouvez spécifier une clause 'Order BY' dans la fonction getter. Vous ne pouvez pas faire cela avec un ensemble. La clause order by peut contenir des EJBQL partiels; Par exemple

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

Si vous laissez ce champ vide, la liste est triée par ordre croissant en fonction de la valeur de la clé primaire.

Basanth Roy
la source
19
Depuis cela m'a envoyé brouiller pour mes documents Hibernate: vous pouvez @Sort un ensemble - utilisez simplement SortedSetcomme expliqué dans les documents .
mabi
mais si vous utilisez SortedSet, il trie avec un comparateur, il n'y a aucun moyen de le classer par "ordre par" de la base de données.
samir105
Puisqu'il s'agit d'une vieille réponse, je voudrais la clarifier. À l' heure actuelle , nous pouvons utiliser @OrderBysur Set. En dessous, Hibernate utilisera OrderedSetTypece qui instanciera a LinkedHashSet, donc l'ordre est préservé. De plus, je suggérerais d'utiliser LinkedHashSeten entité - pour des raisons de cohérence. Source: discourse.hibernate.org/t/…
Martin