2010-03-03 15 views
19

के साथ orm.xml में नामित क्वेरी को परिभाषित करें। मैं अपने नामित प्रश्नों को अपने orm.xml में डाल रहा हूं (मेटा-आईएनएफ में persistence.xml के साथ डाल दिया गया है) लेकिन मेरे orm.xml को हाइबरनेट द्वारा अनदेखा किया जाता है/जेपीए।jpa और hibernate

जब मैं em.createNamedQuery ("myQuery") के साथ अपना नामित क्वेरी बनाने का प्रयास करता हूं, तो यह लौटाता है कि यह यह क्वेरी नहीं मिल सकती है।

मैं एनोटेशन का उपयोग करता हूं और मैं अपने नामित प्रश्नों को orm.xml (केवल उस) में बाहरी करना चाहता हूं।

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <mapping-file>META-INF/orm.xml</mapping-file> 

    <class>com.mysite.Account</class> 

    <properties> 
     <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> 
     <property name="hibernate.cache.use_query_cache" value="true" /> 
     <property name="hibernate.cache.use_second_level_cache" value="true" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="use_sql_comments" value="false" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" /> 
     <property name="hibernate.c3p0.min_size" value="5" /> 
     <property name="hibernate.c3p0.max_size" value="20" /> 
     <property name="hibernate.c3p0.timeout" value="300" /> 
     <property name="hibernate.c3p0.max_statements" value="50" /> 
     <property name="hibernate.c3p0.idle_test_period" value="3000" /> 

     <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" /> 
    </properties> 

</persistence-unit> 

</persistence> 
यहाँ

मेरी orm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> 

<package>com.mysite</package> 

<entity class="Account"> 
    <sql-result-set-mapping name="nicknames"> 
     <column-result name="nickname" /> 
    </sql-result-set-mapping> 
    <table name="Account" /> 
    <named-native-query name="myQuery" result-set-mapping="nicknames"> 
     <query><![CDATA[select a.nickname from Account a]]> 
    </query> 
    </named-native-query> 
</entity> 
</entity-mappings> 

क्या मैं गलत कर रहा हूँ है:

यहाँ मेरी persistence.xml है? मेरा orm.xml क्यों अनदेखा किया जाता है?

धन्यवाद

+0

क्या आपका खाता खाता सफलतापूर्वक मैप किया गया है? अर्थात। क्या आप 'em.find (account.class, someId)' जैसी क्वेरी बना सकते हैं? – Bozho

+1

हाँ मेरा खाता अच्छी तरह से मैप किया गया है, क्योंकि मैं इसे एनोटेशन के साथ सफलतापूर्वक उपयोग करता हूं। –

उत्तर

10

ठीक है मुझे अंततः यह मिला!

मैं मेटा-आईएनएफ निर्देशिका में अपना orm.xml बचा रहा था। जब मैं इस फ़ाइल को अपने पैकेज में ले जाता हूं जहां मेरे पास मेरा डोमेन ऑब्जेक्ट होता है (जैसे कि मेरे उदाहरण में: com.mysite), orm.xml को अनदेखा नहीं किया जाता है और सभी चलाए जाते हैं। com/mysite/orm.xml

+1

@ जेरोम सी। जानना अच्छा (+1)। मैं कोशिश करुंगा। –

+0

यह प्रश्न के उत्तर के रूप में क्यों चिह्नित किया गया है? –

+0

क्योंकि यह वह उत्तर है जिसने प्रश्न की समस्या का समाधान किया है;) –

2

रूप

जब मैं em.createNamedQuery ("myQuery"), यह रिटर्न है कि यह इस क्वेरी नहीं मिल सकता है के साथ अपने नामित क्वेरी बनाने की कोशिश कहा।

आप सही हैं। लेकिन आप भूल जाते हैं निम्नलिखित

आप एक तत्व के अंदर एक नामित क्वेरी परिभाषा जगह, रूट के बजाय, यह इकाई वर्ग के नाम के साथ पहले से जुड़ा हुआ है, तो

तो आपको कॉल करने की जरूरत है

em.createNamedQuery("Account.myQuery") 

मैं उत्सुक हूं: क्या आपकी खाता कक्षा रूट क्लासपाथ में संग्रहीत है ??? यदि नहीं, तो आपने अपना लापता पैकेज ठीक कर दिया है। मान लें कि खाता वर्ग br.com.hibernate.model.domain.Account के अंदर संग्रहीत है। तो तुम

<entity class="br.com.hibernate.model.domain.Account" instead 

के रूप में अपने इकाई घोषित करना चाहिए और आप बस एक adivice रूप

em.createNamedQuery("br.com.hibernate.model.domain.Account.myQuery") instead 

अपने namedQuery कॉल करने के लिए की जरूरत है: जब आप अपने हठ प्रदाता के रूप में हाइबरनेट उपयोग कर रहे हैं, तो आप को परिभाषित करने की जरूरत नहीं है अपने Persistence.xml फ़ाइल में इकाई वर्ग।

संबंध,

+0

अच्छा, मुझे इस तरह का कुछ संदेह था, लेकिन xsd में स्पष्टीकरण नहीं मिला। क्या आप उन दस्तावेज़ों को लिंक कर सकते हैं जहां लिखा गया है? क्या यह कल्पना है? – Bozho

+0

@ बोहोजो ओके, बोहोजो। हाइबरनेट पुस्तक के साथ जावा पर्सिस्टेंस: एक्सएमएल मेटाडेटा में एक नामांकित क्वेरी को परिभाषित करना। इसके अलावा, जेपीए विनिर्देश इसके बारे में बात करता है। –

+0

यह नहीं चलता है। मैंने सभी समाधानों का प्रयास किया है। पूर्ण पथ नाम के लिए, मैं सोच रहा था कि पैकेज नाम टैग करने के लिए डिफ़ॉल्ट पैकेज निर्दिष्ट करने के लिए यहां था जब आपने किसी इकाई का नाम दिया था, नहीं? सरलीकृत करने के लिए, मैंने नामित क्वेरी को मूल इकाई-मैपिंग टैग में भी नतीजे देने की कोशिश की है। जैसे मैंने कहा, orm.xml को अनदेखा किया गया है क्योंकि अगर मैं अपने एक्सएमएल (कोई अंत टैग नहीं) में कोई त्रुटि उत्पन्न करता हूं, तो मुझे हाइबरनेट स्टार्टअप पर कोई त्रुटि नहीं मिली है ... –

0

"META-INF/orm.xml" डिफ़ॉल्ट मैपिंग फ़ाइल है कि देखा हो जाएगा:

मैं भी मानचित्रण-फाइल में पथ (persistence.xml) को बदलने की जरूरत किसी भी जेपीए अनुपालन इकाई प्रबंधक द्वारा।

वास्तव में, यदि आपकी मैपिंग फ़ाइल "मेटा-आईएनएफ/orm.xml" है, तो आपको अपने persistence.xml में इसे परिभाषित करने की आवश्यकता नहीं है।

यह वही है हाइबरनेट विन्यास मैनुअल इस बारे में कहते हैं:

वर्ग तत्व एक EJB3 शिकायत एक्सएमएल मैपिंग फ़ाइल है कि आप मैप कर देंगे निर्दिष्ट करता है। फाइल को कक्षा में होना चाहिए। EJB3 विनिर्देश के अनुसार, Hibernate EntityManager META_INF/orm.xml पर जार फ़ाइल में स्थित मैपिंग फ़ाइल को लोड करने का प्रयास करेगा। बेशक कोई स्पष्ट मैपिंग फ़ाइल भी लोड हो जाएगी। वास्तव में, आप मैपिंग फ़ाइल तत्व यानी किसी भी XML फ़ाइल को प्रदान कर सकते हैं। या तो एचबीएम फाइलें या ईजेबी 3 परिनियोजन वर्णनकर्ता।

Reference: Hibernate configuration

4

आपका orm.xml यह में एक छोटी सी त्रुटि है कि पूरी बात टूट जाता है। मुद्दा यह है कि तत्वों की घोषणाओं के अनुक्रम को संबंधित एक्सएमएल स्कीमा का पालन करना चाहिए (जो विशेष रूप से http://java.sun.com/xml/ns/persistence/orm_1_0.xsd है)। एक्सएमएल कोड को वैधता के माध्यम से एक्सएमएल कोड चलाकर जांचना आसान है जो एक्सएमएल स्कीमा का सम्मान करता है। नीचे आपके orm.xml का सही संस्करण है जो एक आकर्षण के रूप में काम करना चाहिए।

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation=" 
        http://java.sun.com/xml/ns/persistence/orm 
        http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" 
       version="1.0"> 

    <package>com.mysite</package> 

    <entity class="Account"> 
     <table name="Account" /> 
     <named-native-query name="myQuery" result-set-mapping="nicknames"> 
      <query><![CDATA[ 
      select a.nickname from Account a 
      ]]></query> 
     </named-native-query> 
     <sql-result-set-mapping name="nicknames"> 
      <column-result name="nickname" /> 
     </sql-result-set-mapping> 
    </entity> 
</entity-mappings> 
संबंधित मुद्दे