2009-09-15 6 views
16

Questo funziona:Mappatura una lista in ibernazione ordinando invece di un indice campo

<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> 

Ma i miei viaggi sono tutti naturalmente ordinato da loro scheduledDate. Vorrei sostituire lo Set con uno List. Cambiare la raccolta di:

 <list name="trips" cascade="all" order-by="scheduledDate"> 
      <key column="trainId"/> 
      <one-to-many class="Trip"/> 
     </list> 

non funziona, dal momento che la società richiede un <index/>. Non voglio aggiungere un indice al mio tavolo, perché l'ordine è dato dalla data.

In qualsiasi modo ciò può essere fatto? O dovrei semplicemente prendere lo Set da Hibernate e poi ordinarlo da solo nel codice? Sembra inutile quando lo abbiamo già ordinato dal DB.

risposta

31

In realtà, ciò può essere eseguito con i mapping <bag>, <set> o <map>. <bag> utilizza la semantica java.util.List ma non mantiene gli indici degli elementi. Specificando è order-by attributo, i suoi elementi saranno ordinati come parte di SELECT:

<bag name="trips" cascade="all" order-by="scheduledDate"> 
    <key column="trainId"/> 
    <one-to-many class="Trip"/> 
</bag> 

Nota quell'attributo order-by deve specificare colonna nome (s), non il nome della proprietà. Quanto sopra può essere mappato a java.util.List, è possibile fare lo stesso con java.util.Set utilizzando la mappatura <set>. Non c'è bisogno di comparatori :-)

Dettagli sono here

+0

eccellente, grazie! :-) – Magnar

+2

Il link pubblicato ora dà un 404. Dovrebbe essere http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html#collections-sorted – Saheed

0

Mi sono reso conto che l'utilizzo di un List non è il modo corretto per archiviare una raccolta di articoli ordinati naturalmente.

La soluzione è utilizzare un(come un TreeSet) con un Comparator.