2011-07-03 14 views
61

¿Hay alguna diferencia si usoLista @OneToMany <> vs Set <> diferencia

@OneToMany 
public Set<Rating> ratings; 

o si uso

@OneToMany 
public List<Rating> ratings; 

ambos trabajan bien, sé la diferencia entre la lista y un conjunto Sin embargo, no sé si esto influye en la forma en que Hibernate (o más bien JPA 2.0) lo maneja.

Respuesta

77

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

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 usar un Set en lugar de un List para al menos una de las colecciones.

A menudo es difícil usar Sets with Hibernate cuando tiene que definir equals y hashCode en las entidades y no tiene una clave funcional inmutable en la entidad.

+1

Y para el detalle de lo que sucede con una lista, vea http://stackoverflow.com/q/1995080/2495717. – ben3000

26

Si usa una Lista, puede especificar una cláusula 'Ordenar 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, a continuación, la lista se ordena en orden ascendente basado en el valor de la clave primaria.

+12

Dado que me envió a buscar mis documentos de Hibernate: puede * '@ Sort 'un conjunto; simplemente use' SortedSet' como se explica [en los documentos] (http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/# collections-sorted). – mabi