2009-09-15 8 views
16

यह काम करता है के आदेश देने से हाइबरनेट में एक सूची का मिलान:बजाय एक सूचकांक मैदान

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

लेकिन मेरी यात्राएं सब स्वाभाविक रूप से उनके scheduledDate द्वारा आदेश दिया गया है। मैं Set को List के साथ प्रतिस्थापित करना चाहता हूं। संग्रह को बदलना:

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

काम नहीं करता है, क्योंकि अब इसे <index/> की आवश्यकता है। मैं अपनी तालिका में एक इंडेक्स नहीं जोड़ना चाहता, क्योंकि ऑर्डरिंग दिनांक द्वारा दी गई है।

कोई भी तरीका यह किया जा सकता है? या मुझे हाइबरनेट से Set मिलना चाहिए, और फिर इसे कोड में सॉर्ट करें? जब हम पहले ही डीबी द्वारा आदेश दिया गया है तो अनावश्यक लगता है।

उत्तर

31

दरअसल, यह <bag>, <set> या <map> मैपिंग के साथ किया जा सकता है। <bag>java.util.List अर्थशास्त्र का उपयोग करता है लेकिन तत्व अनुक्रमणिका को बनाए रखता है। निर्दिष्ट करके यह order-by विशेषता है, उसके तत्वों का चयन के हिस्से के रूप आदेश दिया की जाएगी:

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

ध्यान दें कि order-by विशेषता स्तंभ नाम (s), नहीं संपत्ति नाम निर्दिष्ट करने की जरूरत है। उपरोक्त को java.util.List पर मैप किया जा सकता है, आप <set> मैपिंग का उपयोग करके java.util.Set के साथ ऐसा ही कर सकते हैं। तुलनाकर्ताओं की कोई ज़रूरत नहीं :-)

विवरण here

+0

उत्कृष्ट, धन्यवाद! :-) – Magnar

+2

पोस्ट किया गया लिंक अब 404 देता है। Http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html#collections-sorted होना चाहिए – Saheed

0

मुझे एहसास हुआ कि List का उपयोग करके स्वाभाविक रूप से आदेशित वस्तुओं का संग्रह संग्रहीत करने का सही तरीका नहीं है।

समाधान SortedSet (TreeSet की तरह) Comparator के साथ उपयोग करना है।