@OneToMany List <> vs Set <> diferença

94

Existe alguma diferença se eu usar

@OneToMany
public Set<Rating> ratings;

ou se eu usar

@OneToMany
public List<Rating> ratings;

ambos funcionam bem, eu sei a diferença entre a lista e um conjunto, porém não sei se isso faz alguma diferença como o hibernate (ou melhor, JPA 2.0) lida com isso.

M4ks
fonte

Respostas:

109

Uma lista, se não houver uma coluna de índice especificada, será tratada como um pacote pelo Hibernate (sem ordem específica).

Uma diferença notável no manuseio do Hibernate é que você não pode buscar duas listas diferentes em uma única consulta. Por exemplo, se você tiver uma Personentidade com uma lista de contatos e uma lista de endereços, não será capaz de usar uma única consulta para carregar pessoas com todos os seus contatos e todos os seus endereços. A solução neste caso é fazer duas consultas (o que evita o produto cartesiano), ou usar a em Setvez de a Listpara pelo menos uma das coleções.

Geralmente é difícil usar Sets com Hibernate quando você precisa definir equalse hashCodenas entidades e não tem uma chave funcional imutável na entidade.

JB Nizet
fonte
3
E para obter detalhes sobre o que acontece com uma lista, consulte stackoverflow.com/q/1995080/2495717 .
ben3000
31

Se você usar uma lista, poderá especificar uma cláusula 'Order BY' na função getter. Você não pode fazer isso com um Set. A cláusula order by pode conter EJBQL parcial; Por exemplo

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

Se você deixar este campo em branco, a lista será classificada em ordem crescente com base no valor da chave primária.

Basanth Roy
fonte
19
Uma vez que ele me enviou uma busca por meus documentos do Hibernate: você pode @Sort definir um conjunto - apenas use SortedSetconforme explicado nos documentos .
mabi
mas se você usar SortedSet, ele classifica com o comparador, não há como torná-lo ordenado pelo banco de dados "ordenar por".
samir105
Como é uma resposta antiga, gostaria de esclarecê-la. Atualmente, podemos usar @OrderByem Set. Abaixo, o Hibernate usará o OrderedSetTypeque irá instanciar um LinkedHashSet, então a ordem é preservada. Além disso, eu sugeriria usar LinkedHashSetem entidade - para fins de consistência. Fonte: discourse.hibernate.org/t/…
Martin