@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).

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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.