2009-12-24 10 views
7

@Entity एनोटेशन सेट करने के लिए पर्याप्त क्यों नहीं है?एनोटेशन का उपयोग करते समय मुझे अपने hibernate.cfg.xml में प्रत्येक कक्षा को क्यों घोषित करना है?

क्या मुझे यहां बिंदु (प्रदर्शन?) याद आ रही है?

धन्यवाद।

उत्तर

7

एनोटेशन पर्याप्त नहीं है क्योंकि हाइबरनेट यह नहीं जानता कि आपकी एनोटेटेड कक्षाएं किसी प्रकार की स्पष्ट घोषणा के बिना कहाँ रहते हैं। यह सिद्धांत रूप में, कक्षा के प्रत्येक वर्ग को स्कैन कर सकता है और एनोटेशन की तलाश कर सकता है लेकिन यह बड़ी परियोजनाओं के लिए बहुत महंगा होगा।

आप वसंत का उपयोग कर सकते हैं जिसमें एक सहायक है जो आपको अपने हाइबरनेट ऑब्जेक्ट्स में पैकेज (पैकेज) निर्दिष्ट करने की अनुमति दे सकता है और यह इन पैकेजों को @Entity के लिए स्कैन करेगा। यदि आपके पास अपनी सभी ऑब्जेक्ट्स को निश्चित पैकेजों की एक छोटी संख्या में है तो यह अच्छी तरह से काम करता है।

उदा।

<bean id="referenceSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan"> 
     <array> 
     <value>com.xxx.hibernate.objects</value> 
     </array> 
    </property> 
    </bean> 

उपर्युक्त वसंत घोषणा है। यदि आप उपर्युक्त वाक्यविन्यास से परिचित नहीं हैं तो आप इसे प्रोग्रामेटिक रूप से बना सकते हैं।

AnnotationSessionFactoryBean sfb = new AnnotationSessionFactoryBean(); 
sfb.setDataSource(ds); 
sfb.setHibernateProperties(hibProps); 
sfb.setPackagesToScan(...); 
sfb.initialise(); 
SessionFactory sf = sfb.getObject(); 

यह तो आप कच्चे गुण का उपयोग करें या एक पूर्व config'd डेटा स्रोत में पारित कर सकते हैं config विकल्पों में से एक गुच्छा का समर्थन करता है।

+0

तुम भी 'LocalSessionFactoryBean' उपयोग कर सकते हैं इन दिनों, जिस स्थिति में एक' hibernate.cfg.xml' फ़ाइल प्रदान करने का समर्थन करता है कि आप उन में से एक की जरूरत है। मुझे यकीन नहीं है कि वसंत के किस संस्करण ने इसे 'setPackagesToScan' विधि प्राप्त की है, लेकिन यह निश्चित रूप से अब एक है। – Jules

3

यदि आप hibernate.archive.autodetection संपत्ति true पर सेट करते हैं तो आप नहीं करते हैं। यहां एक प्रदर्शन समस्या है क्योंकि हाइबरनेट जेपीए एनोटेशन के लिए जार फाइलों की खोज करेगा। ध्यान दें, यह उन वर्गों को भी शुरू करेगा।

2

हाँ :)

hibernate.cfg.xml फ़ाइल आपके संस्थाओं निर्दिष्ट करने के लिए नहीं किया जाता है, यह हाइबरनेट के कनेक्शन मापदंडों और वैश्विक सेटिंग्स तरह बातें कॉन्फ़िगर करने के लिए प्रयोग किया जाता है। hibernate.cfg.xml फ़ाइल में इकाइयों का पता लगाने के तरीके के निर्देश भी शामिल हैं। आप <mapping resource=XYZ> का उपयोग कर एक्सएमएल मैपिंग फाइलों को सूचीबद्ध कर सकते हैं, लेकिन यदि आप @Entity जैसे जेपीए एनोटेशन का उपयोग कर रहे हैं, तो यह अनावश्यक है, हाइबरनेट उन्हें स्वतः पहचान लेगा।

एनोटेशन मिश्रण और एक्सएमएल एक्सप्लोर कर सकते हैं यदि आप चुनते हैं, लेकिन अधिकांश स्थितियों में इसका कोई मतलब नहीं है।

+1

"यदि आप @ एन्टीटी जैसे जेपीए एनोटेशन का उपयोग कर रहे हैं, तो यह अनावश्यक है, हाइबरनेट उन्हें स्वतः पहचान लेगा" - यह डिफ़ॉल्ट रूप से स्पष्ट रूप से ऐसा नहीं करता है। यदि मैं इसे कक्षाओं के बारे में नहीं बताता हूं तो मुझे अनियंत्रित इकाई प्रकार अपवाद मिलते हैं (मैं उन्हें 'एनोटेशन कॉन्फ़िगरेशन.एडएनोटेटेड क्लास' का उपयोग प्रोग्रामेटिक रूप से उनके बारे में बताने के लिए करता हूं)। यकीन नहीं है कि मैं क्या गलत कर रहा हूं, लेकिन यह पूरी तरह से स्वचालित नहीं है। – Jules

1

डिफ़ॉल्ट रूप से सभी ठीक से वर्गों की व्याख्या की और सभी hbm.xml फ़ाइलें मिल संग्रहण के भीतर हठ इकाई विन्यास में जुड़ जाते हैं। आप कक्षा तत्व के के माध्यम से कुछ बाहरी इकाई जोड़ सकते हैं।

Hibernate EntityManager Reference Docs

संबंधित मुद्दे