java - ejemplo - @OneToMany List<> vs Set<> difference
onetomany jpa bidirectional (2)
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 ordena en orden ascendente según el valor de la clave principal.
¿Hay alguna diferencia si uso
@OneToMany
public Set<Rating> ratings;
o si uso
@OneToMany
public List<Rating> ratings;
ambos funcionan bien, sé la diferencia entre la lista y un conjunto, sin embargo, no sé si esto hace alguna diferencia cómo lo maneja la hibernación (o más bien JPA 2.0).
Una lista, si no hay una columna de índice especificada, será manejada como una bolsa por Hibernate (sin pedidos específicos).
Una diferencia notable en el manejo de Hibernate es que no puede obtener dos listas diferentes en una sola consulta. Por ejemplo, si tiene una entidad Person
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 un Set
lugar de una List
para al menos una de las colecciones.
A menudo es difícil usar Sets with Hibernate cuando se deben definir equals
y hashCode
en las entidades y no tener una clave funcional inmutable en la entidad.