Differenza @OneToMany <> rispetto a Set <>


94

C'è qualche differenza se uso

@OneToMany
public Set<Rating> ratings;

o se uso

@OneToMany
public List<Rating> ratings;

entrambi funzionano bene, conosco la differenza tra list e un set, tuttavia non so se questo fa differenza nel modo in cui hibernate (o meglio JPA 2.0) lo gestisce.

Risposte:


109

Un elenco, se non è specificata una colonna indice, verrà gestito come un sacchetto da Hibernate (nessun ordine specifico).

Una differenza notevole nella gestione di Hibernate è che non è possibile recuperare due elenchi diversi in una singola query. Ad esempio, se hai Personun'entità con un elenco di contatti e un elenco di indirizzi, non sarai in grado di utilizzare una singola query per caricare le persone con tutti i loro contatti e tutti i loro indirizzi. La soluzione in questo caso è fare due interrogazioni (che evita il prodotto cartesiano), oppure usare a Setinvece di a Listper almeno una delle collezioni.

Spesso è difficile usare Set con Hibernate quando devi definire equalse hashCodesulle entità e non hai una chiave funzionale immutabile nell'entità.


3
E per i dettagli di ciò che accade con un elenco, vedere stackoverflow.com/q/1995080/2495717 .
ben3000

31

Se utilizzi un elenco, puoi specificare una clausola "Order BY" nella funzione getter. Non puoi farlo con un set. La clausola order by può contenere EJBQL parziale; Per esempio

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

Se lasci vuoto questo campo, l'elenco viene ordinato in ordine crescente in base al valore della chiave primaria.


19
Dal momento che mi ha mandato a rimescolare i miei documenti di Hibernate: puoi @Sort un set - basta usare SortedSetcome spiegato nei documenti .
mabi

ma se usi SortedSet, ordina con il comparatore, non c'è modo di renderlo ordinato in base all '"ordina per" del database.
samir105

Poiché è una vecchia risposta, vorrei chiarirla. Attualmente possiamo usare @OrderBysu Set. Sotto, Hibernate userà OrderedSetTypeche istanzerà un LinkedHashSet, quindi l'ordine è preservato. Inoltre suggerirei di utilizzare LinkedHashSetin entità - per motivi di coerenza. Fonte: discourse.hibernate.org/t/…
Martin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.