@OneToMany List <> vs Set <> diferencia

94

¿Hay alguna diferencia si uso

@OneToMany
public Set<Rating> ratings;

o si uso

@OneToMany
public List<Rating> ratings;

ambos funcionan bien, conozco la diferencia entre la lista y un conjunto, sin embargo, no sé si esto hace alguna diferencia en cómo lo maneja Hibernate (o más bien JPA 2.0).

M4ks
fuente

Respuestas:

109

Una lista, si no hay una columna de índice especificada, solo será manejada como una bolsa por Hibernate (sin orden específico).

Una diferencia notable en el manejo de Hibernate es que no puede buscar dos listas diferentes en una sola consulta. Por ejemplo, si tiene una Personentidad que tiene una lista de contactos y una lista de direcciones, no podrá usar una sola consulta para cargar personas con todos sus contactos y todas sus direcciones. La solución en este caso es realizar dos consultas (lo que evita el producto cartesiano), o utilizar a en Setlugar de a Listpara al menos una de las colecciones.

A menudo es difícil usar Conjuntos con Hibernate cuando tienes que definir equalsy hashCodeen las entidades y no tienes una clave funcional inmutable en la entidad.

JB Nizet
fuente
3
Y para conocer los detalles de lo que sucede con una lista, consulte stackoverflow.com/q/1995080/2495717 .
ben3000
31

Si usa una lista, puede especificar una cláusula 'Order BY' en la función getter. No puedes hacer eso con un set. La cláusula order by puede contener EJBQL parcial; Por ejemplo

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

Si deja este campo en blanco, la lista se clasifica en orden ascendente según el valor de la clave principal.

Basanth Roy
fuente
19
Dado que me envió a buscar mis documentos de Hibernate: puede @Sort un conjunto, solo use SortedSetcomo se explica en los documentos .
mabi
pero si usa SortedSet, se ordena con el comparador, no hay forma de ordenarlo por el "orden por" de la base de datos.
samir105
Como es una respuesta antigua, me gustaría aclararla. Actualmente podemos usar @OrderByen Set. Debajo, Hibernate usará OrderedSetTypeque instanciará a LinkedHashSet, por lo que el orden se conserva. Además, sugeriría usarlo LinkedHashSeten entidad, por razones de coherencia. Fuente: speech.hibernate.org/t/…
Martin