Mapeamento de uma lista em hibernação por encomenda em vez de um índice de campo
-
07-07-2019 - |
Pergunta
Isso funciona:
<hibernate-mapping>
<class name="Train" table="Trains">
<id column="id" name="id" type="java.lang.String" length="4">
<generator class="assigned" />
</id>
<set name="trips" cascade="all">
<key column="trainId"/>
<one-to-many class="Trip"/>
</set>
</class>
</hibernate-mapping>
Mas minhas viagens são todos naturalmente ordenados pela scheduledDate
. Gostaria de substituir o Set
com um List
. Alterando a coleção para:
<list name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</list>
não funciona, uma vez que agora exige um <index/>
. Eu não quero adicionar um índice à minha mesa, porque a ordem é dada pela data ??em>.
De qualquer forma isso pode ser feito? Ou devo apenas obter o Set
do Hibernate, e, em seguida, classificá-lo eu mesmo no código? Parece desnecessário quando já tê-lo ordenado pelo DB.
Solução
Na verdade, isso pode ser feito com <bag>
, <set>
ou <map>
mapeamentos. <bag>
usa semântica java.util.List
mas não mantém índices de elementos. Especificando-atributo order-by
, seus elementos serão ordenados como parte da SELECT:
<bag name="trips" cascade="all" order-by="scheduledDate">
<key column="trainId"/>
<one-to-many class="Trip"/>
</bag>
Note que as necessidades de atributos order-by
para especificar coluna Nome (s), não o nome da propriedade. A descrição acima pode ser mapeado para java.util.List
, você pode fazer o mesmo com java.util.Set
usando mapeamento <set>
. Não há necessidade de comparadores: -)
Os detalhes estão aqui
Outras dicas
Eu percebi que usando um List
não é a maneira correta de armazenar uma coleção de itens naturalmente ordenadas.
A solução é a utilização de um SortedSet
(como um TreeSet
) com um Comparator
.