2009-06-29 8 views
6

मैं वर्तमान में ओएसजीआई का उपयोग कर परीक्षण कर रहा हूं। मैं ग्रहण के माध्यम से इसे चला रहा हूँ। मैं एक OSGi समाधान का हिस्सा के रूप में मेरी डीएओ परत करना चाहते हैं, लेकिन मेरी पहली बड़ी बाधा यह त्रुटि है:Persistence.xml और ओएसजीआई (विषुव)

Jun 29, 2009 6:12:37 PM org.hibernate.cfg.annotations.Version <clinit> 
INFO: Hibernate Annotations 3.3.0.GA 
Jun 29, 2009 6:12:37 PM org.hibernate.ejb.Version <clinit> 
INFO: Hibernate EntityManager 3.3.0.GA 
Jun 29, 2009 6:12:37 PM org.hibernate.ejb.Ejb3Configuration configure 
INFO: Could not find any META-INF/persistence.xml file in the classpath 

मैं विभिन्न स्थानों का एक बहुत में persistence.xml फ़ाइल डाल, कोई फायदा नहीं हुआ है। क्या मैं गलत कर रहा हूं पर कोई विचार?

क्या persistence.xml मैन्युअल रूप से लोड करने का कोई तरीका है?

उत्प्रेरक इस तरह दिखता है:

alt text http://www.freeimagehosting.net/uploads/7b7b7d2d30.jpg

यहाँ मेरी MANIFEST.MF

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Dao Plug-in 
Bundle-SymbolicName: Dao 
Bundle-Version: 1.0.0 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Import-Package: org.osgi.framework;version="1.4.0" 
Bundle-Activator: com.activator.PersistenceActivator 
Export-Package: com.dao.service 
Require-Bundle: HibernateBundle;bundle-version="1.0.0" 
है:

package com.activator; 


public class PersistenceActivator implements BundleActivator { 

    @Override 
    public void start(BundleContext arg0) throws Exception { 

     EntityManagerFactory emf = Persistence 
       .createEntityManagerFactory("postgres"); 
     EntityManager em = emf.createEntityManager(); 

     SimpleDaoImpl dao = new SimpleDaoImpl(); 
     dao.setEntityManager(em); 

    } 

    @Override 
    public void stop(BundleContext arg0) throws Exception { 
     // TODO Auto-generated method stub 

    } 

} 

यहाँ क्या मेरी निर्देशिका संरचना लगता है कि है

हाइबरनेटबंडल में सभी हाइबरनेट और पर्सिस्टेंस जार शामिल हैं।

बंडल-क्लासपाथ:

यहाँ मेरी Persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 

<persistence> 

    <!-- Sample persistence using PostgreSQL. See postgres.txt. --> 
    <persistence-unit name="postgres" transaction-type="RESOURCE_LOCAL"> 

     <properties> 


      <property name="hibernate.archive.autodetection" value="class" /> 

      <!-- 
       Comment out if schema exists & you don't want the tables dropped. 
      --> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <!-- drop/create tables @startup, drop tables @shutdown --> 


      <!-- Database Connection Settings --> 
      <property name="hibernate.connection.autocommit">true</property> 
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
      <property name="hibernate.connection.username" value="postgres" /> 
      <property name="hibernate.connection.password" value="postgres" /> 
      <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/test" /> 

      <!-- Not sure about these... --> 
      <property name="hibernate.max_fetch_depth">16</property> 
      <property name="hibernate.jdbc.batch_size">1000</property> 
      <property name="hibernate.use_outer_join">true</property> 
      <property name="hibernate.default_batch_fetch_size">500</property> 

      <!-- Hibernate Query Language (HQL) parser. --> 
      <property name="hibernate.query.factory_class"> 
       org.hibernate.hql.ast.ASTQueryTranslatorFactory</property> 

      <!-- Echo all executed SQL to stdout --> 
      <property name="hibernate.show_sql">true</property> 
      <property name="hibernate.format_sql">false</property> 

      <!-- Use c3p0 for the JDBC connection pool --> 
      <property name="hibernate.c3p0.min_size">3</property> 
      <property name="hibernate.c3p0.max_size">100</property> 
      <property name="hibernate.c3p0.max_statements">100</property> 

      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" /> 

     </properties> 
    </persistence-unit> 



</persistence> 

बातें मैं कोई भाग्य के साथ प्रकट की क्लासपाथ में की कोशिश की है है।, META-INF/persistence.xml

बंडल-क्लासपाथ:।, ../META-INF/persistence.xml

बंडल-क्लासपाथ:।, /META-INF/persistence.xml

बंडल-क्लासपाथ:।, ./META-INF/persistence.xml

बंडल-क्लासपाथ:। , META-INF

बंडल-क्लासपाथ:।, ../META-INF

बंडल-क्लासपाथ :।,/META-INF

बंडल-क्लासपाथ:।, ./META-INF

बंडल-क्लासपाथ:।, C: \ कार्यस्थान \ OSGiJPA \ दाव \ META-INF \ हठ .xml

बंडल-क्लासपाथ:।, C: \ कार्यस्थान \ OSGiJPA \ दाव \ META-INF

उत्तर

1

मैं persistence.xml लेकिन hibernate.cfg.xml जो इसी तरह की है उपयोग नहीं कर रहा:

 
src/main/resource/hibernate/hibernate.cfg.xml 

मेरी उत्प्रेरक में मैं बंडल संदर्भ के माध्यम से फ़ाइल हो रही है: यहाँ कुछ उदाहरण कोड है मैं कैसे करना है >

 
private void initHibernate(BundleContext context) { 
     try { 
      final AnnotationConfiguration cfg = new AnnotationConfiguration(); 
      cfg.configure(context.getBundle().getEntry("/src/main/resource/hibernate/hibernate.cfg.xml")); 
      sessionFactory = cfg.buildSessionFactory(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
     } 
    } 

आप लाइन जो कॉन्फ़िग फ़ाइल हो जाता है देख सकते हैं है:

context.getBundle().getEntry("/src/main/resource/hibernate/hibernate.cfg.xml")
यह और भी है कि फाइल को संदर्भित

जैसा कि आप देख सकते हैं कि मेरा hibernate.cfg.xml मेटा-आईएनएफ फ़ोल्डर के अंदर नहीं है। यह सिर्फ रूट फ़ोल्डर में/src/......

उम्मीद है कि मदद करता है।

क्रिस्टोफ

0

अपने प्रकट

बंडल-क्लासपाथ में इस तरह बंडल-क्लासपाथ उपयोग करके देखें:।, /location/of/persistence.xml

+1

कोई भाग्य। मैं कोशिश की है: ** बंडल-क्लासपाथ:।, META-INF/persistence.xml ** ** बंडल-क्लासपाथ:।, ../META-INF/persistence.xml** ** बंडल-क्लासपाथ:।, /META-INF/persistence.xml** ** बंडल-क्लासपाथ:।, ./META-INF/persistence.xml** ** बंडल-क्लासपाथ:।, मेटा-आईएनएफ ** ** बंडल-क्लासपाथ:।, ../META-INF** ** बंडल-क्लासपाथ:।,/META-INF ** ** बंडल-क्लासपाथ:।, ./META- आईएनएफ ** ** बंडल-क्लासपाथ:।, सी: \ वर्कस्पेस \ OSGiJPA \ Dao \ META-INF \ persis tence.xml ** ** बंडल-क्लासपाथ:।, सी: \ वर्कस्पेस \ OSGiJPA \ Dao \ META-INF ** – systemoutprintln

+0

सही दिखाई नहीं दिया, इसलिए मैंने इसे स्वयं पोस्ट में रखा – systemoutprintln

+0

move persistence.xml जार बंडल की जड़ तक? इसे – bwobbones

0

मेटा-इंफ निर्देशिका क्लासपाथ पर नहीं है। यह इसे अपने src डार्टक्टोरी के तहत बस रखकर काम करना चाहिए। यदि आप इसे एक अलग स्थान पर चाहते हैं, तो आपको उस निर्देशिका को शामिल करने के लिए बंडल-क्लासपाथ निर्दिष्ट करना होगा। डिफ़ॉल्ट रूप से क्लासपाथ '।' है।

+0

चुनना चाहिए मैंने अभी मेटा-आईएनएफ को src निर्देशिका में ले जाने की कोशिश की है .. फिर भी काम नहीं करता है। मैंने बंडल-क्लासपाथ में persistence.xml को स्पष्ट रूप से इंगित करने का भी प्रयास किया है और यह काम नहीं करता है। – systemoutprintln

+0

@Grasper - निर्देशिका को स्थानांतरित न करें, persistence.xml फ़ाइल को स्रोत में ले जाएं ताकि जब इसे संकलित किया जाए तो यह आपके क्लासपाथ पर है। – Robin

+0

इसलिए मैंने persistence.xml को src में रखा है, और मेरे पास है।'कक्षा में और यह अभी भी काम नहीं करता है। आपकी मदद के लिए धन्यवाद :-) – systemoutprintln

5

उपयोग EclipseLink और हाइबरनेट और अन्य कार्यान्वयन के बारे में भूल जाते हैं, क्योंकि:

  • आप बहुत अधिक classloader साथ खेलने के लिए होगा ... Thread.currentThread()। setContextClassLoader (...)

  • आप बंडल-क्लासपाथ विशेषता सेट करने और मैन्युअल रूप से निर्भरता जोड़ने के लिए लुभाने वाले होंगे जार बंडल रोकना।

  • आप मिल जाएगा प्रदाता त्रुटियों नहीं मिला या आप persistence.xml

उपरोक्त सभी प्रयासों कई प्रयासों के बाद काम नहीं कर सकते ढूँढने में सक्षम नहीं हो सकता है।

हालांकि, एक्लिप्ससेंक के साथ यह कोई ब्रेनर नहीं है, कार्यान्वयन को ओएसजीआई पर्यावरण में बॉक्स से बाहर काम करने के लिए डिज़ाइन किया गया था और कोई भी वर्ग लोडिंग सिरदर्द नहीं है।

+2

एक्लिप्ससेंक वास्तव में ओएसजीआई के लिए बेहतर विकल्प है (वैसे ... जेपीए 2 के लिए इसकी आरआई)। ईएल UserGuid के अनुसार आपको EMFactory को इसके साथ लोड करना चाहिए: हैश मैप <स्ट्रिंग, ऑब्जेक्ट> गुण = नया हैश मैप <स्ट्रिंग, ऑब्जेक्ट>(); Properties.put (PersistenceUnitProperties.CLASSLOADER, this.getClass()। GetClassLoader()); entityManagerFactory = नया PersistenceProvider()। CreateEntityManagerFactory (PU_NAME, गुण); – lostiniceland

+0

एक्लीपसेलिंक को छोड़कर कुछ जेपीए अनुबंधों तक नहीं टिकता है और इसमें इसके सबसे मौलिक कार्यों (जैसे सहेजें, हटाएं) में बग हैं। मैं केवल तभी अनुशंसा कर सकता हूं यदि इससे आपको परेशान न हो या आप एक परीक्षण और त्रुटि व्यक्ति हैं। –

1

आपको उस निर्देशिका में होना चाहिए जिसमें क्लासपाथ पर मेटा-आईएनएफ शामिल है। प्रत्येक निर्देशिका को मेटा-आईएनएफ के लिए खोजा जाता है और यदि पाया जाता है, तो persistence.xml की खोज की जाती है।

यदि आप क्लासपाथ पर "मेटा-आईएनएफ" डालते हैं, तो आपको उस निर्देशिका में एक और मेटा-आईएनएफ की आवश्यकता होगी।

+0

धन्यवाद..मुझे इसी तरह की समस्या का सामना करना पड़ रहा था .... यह मेरे लिए काम करता था। –

0

मुझे एक ही समस्या मिल रही है।

मुझे लगता है कि ग्रहण लिंक ओएसजीआई पर्यावरण में उपयोग करने का सबसे अच्छा विकल्प है। और कोई समस्या नहीं है क्योंकि आप मूल रूप से जेपीए कार्यान्वयन के साथ काम करेंगे।जब आपको हाइबरनेट पर जाने की आवश्यकता होती है, तो बस persintece.xml कॉन्फ़िगरेशन और कुछ libs को प्रतिस्थापित करें।

+0

यहां ट्यूटोरियल है: http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE –

0

आप गुण सेट करने के लिए (हाइबरनेट के लिए यह अलग होगा) की जरूरत है:

javax.persistence.provider = org.apache.openjpa.persistence.PersistenceProviderImpl

कॉल के लिए:

हठ। createEntityManagerFactory (entityManagerFactoryName, गुण)

इसे काम करने के लिए।

और जैसा कि पहले बताया गया है, आपको क्लासलोडर रैपिंग की आवश्यकता है। ऐसा करने के लिए आप https://issues.apache.org/jira/browse/OPENJPA-1783 से ClassloaderEntityManager का उपयोग कर सकते हैं।

सादर

2
  1. (केवल एक सुझाव): बेहतर अगर आप एक आलसी लोडर बजाय उत्प्रेरक में काम करने का उपयोग करें। उदाहरण के लिए एक सिंगलटन का उपयोग करें जिसे SimpleDaoImpl contructor में बुलाया जाता है।
  2. मेटा-आईएनएफ/persistent.xml को src फ़ोल्डर (src/META-INF/persistent.xml) के अंतर्गत ले जाएं क्योंकि मेटा-आईएनएफ फ़ोल्डर के तहत क्लासपाथ में नहीं है, यह केवल रनटाइम मोड में काम करता है।
  3. यदि आप एक्लिप्ससेंक जेपी ओएसजीआई का उपयोग कर रहे हैं, तो आपका MANIFEST.MF जेपीए-पर्सिस्टेंस एंट्री प्रविष्टि की अनुपलब्ध है। postgres

    MANIFEST.MF में

    :

    जेपीए-PersistenceUnits जोड़ें।

  4. फिर आपके लॉन्च कॉन्फ़िगरेशन में org.eclipse.persistence.jpa.osgi (ecliselink 2.3.x के लिए अन्यथा org.eclipse.persistence.jpa 2.1.x) के लिए प्रारंभ स्तर सेट करें और javax का स्तर प्रारंभ करें करने के लिए 1.

शुभकामनाएँ .persistence, वास्तव में 2.3 तैनाती में कोई समस्या है, bundleresource प्रबंधन नहीं करती है: // xxxx यूआरएल :(, 2.1.2 काम करता है बहुत अच्छी तरह से;)