2011-09-16 13 views
21

हम एक बहुत ही मॉड्यूलर फैशन में स्प्रिंग, हाइबरनेट और मेवेन के साथ एक वेब अनुप्रयोग विकसित कर रहे हैं। डेटा एक्सेस को परिभाषित करने और विशिष्ट सामग्री को देखने वाली मूल परियोजनाएं हैं, फिर तर्क और संस्थाओं (@Entity) को परिभाषित मॉड्यूल हैं और फिर वेब ऐप परिभाषित नियंत्रक और दृश्य है।जेपीए - एकाधिक जार @Entity ऑब्जेक्ट्स को परिभाषित करते हैं

अब हमारे पास खाता और भूमिका जैसे सुरक्षा इकाइयों को परिभाषित करने वाला एक सुरक्षा मॉड्यूल है और हमारे पास प्रोटोटाइप मॉड्यूल है जो ग्राहक और ऑर्डर जैसे कुछ उदाहरण इकाइयों को परिभाषित करता है। दोनों को PersistenceUnitpersistence.xml के अंदर परिभाषित किया गया है जो PersistenceUnit नाम को छोड़कर बहुत खाली है, क्योंकि सभी डेटाबेस कॉन्फ़िगरेशन वेब ऐप में datasource.xml के साथ किया जाता है। वेब ऐप को दोनों जार को मैवेन निर्भरता के रूप में लोड करना होता है।

दोनों परियोजनाएं ठीक से निर्माण करेंगी, सभी इकाइयों को स्वत: संचरित करेंगी और उन्हें अपने संबंधित यूनिट परीक्षणों के लिए तैयार करेंगी। व्यक्तिगत रूप से जोड़े जाने पर वे वेब ऐप के भीतर सफलतापूर्वक लोड हो जाएंगे।

हालांकि, जैसे ही दोनों एक ही समय में लोड हो जाते हैं, दूसरा व्यक्ति पहले से ही PersistenceUnit को ओवरराइड करेगा और इस प्रकार पहले सभी इकाइयों के लिए IllegalArgumentException : Not an entity बना देगा। यदि दोनों परियोजनाओं में एक अलग दृढ़ता इकाई है, तो वेब ऐप लोड करने से एक और अपवाद फेंक देगा कि no single default persistence unit परिभाषित किया गया है।

तो .. मैं उन सब को persistence.xml (जैसे here) बल्कि घटक के माध्यम से स्कैन के अंदर परिभाषित करने के लिए बिना सभी @Entity एनोटेट कक्षाएं अपने वेब अनुप्रयोग में लोड करने के लिए कैसे मिल सकता है? This, एक विचार की तरह लगता है हालांकि मैं कैसे उपयोग करने के लिए जानते हैं और यह परीक्षण नहीं है ...

मुझे लगता है कि हम या तो वेब अनुप्रयोग के अंदर सभी PersistenceUnits विलय या प्रोग्राम के रूप में सभी संस्थाओं को लोड करने के लिए है। Persistence.xml के अंदर उन्हें हार्ड-कोडित परिभाषित करना हमारे लिए एक विकल्प नहीं है।

+0

पहले उत्तर के विषय में: जहाँ तक मुझे पता के रूप में , वसंत पहले से ही एनोटेड कक्षाओं के लिए स्कैन करता है और उन्हें 'PersistenceUnit' में जोड़ता है। समस्या यह है कि मुझे सभी 'PersistenceUnits' का नाम देना होगा जिसके परिणामस्वरूप उन्हें एक-दूसरे को ओवरराइड कर दिया जाएगा। तो मैं अपने वेब ऐप में सभी persistenceUnits को मर्ज करने का एक तरीका ढूंढ रहा हूं। पता नहीं है कि [यह] [1] (नीचे) क्या करेगा, हालांकि मुझे नहीं पता कि 'मर्जिंग पर्सिस्टेंस यूनिटपोस्टप्रोसेसर' [1]: http://forum.springsource.org/showthread.php पंजीकृत करने के लिए कहां है? 61763-जेपीए-और-बहु-दृढ़ता-इकाइयों – Pete

उत्तर

4

हम एक समान मॉड्यूल लेआउट, का उपयोग करते हैं, लेकिन हम अपने आवेदन के युद्ध-भाग में दृढ़ता संदर्भ डालते हैं और मॉड्यूलर के डीएओ में इकाई प्रबंधक को इंजेक्ट करते हैं। यूनिट परीक्षण के अलावा, मॉड्यूल में कोई पु नहीं है। हमने ऐसा इसलिए किया क्योंकि हम डर गए थे, कि एकाधिक मॉड्यूल में फैले लेनदेन में परेशानी हो सकती है।

डीएओ

@PersistenceContext 
private EntityManager em; 

persistance.xml आप तत्वों के साथ सभी संस्थाओं भर्ती करने की जरूरत में

<persistence-unit name="myPU"> 
    <class>com.Entity1</class>  
<class>com.Entity2</class> 

आदि

+1

मैं देखता हूं .. मैंने उस दृष्टिकोण की कोशिश की और यह काम करता है । लेकिन क्या यह हमेशा persistence.xml फ़ाइल (साथ ही इकाई परीक्षण persistence.xml फ़ाइलों) को अद्यतन करने के लिए काफी बोझिल महसूस नहीं करता है? क्या इसे स्वचालित रूप से लोड करने के लिए कोई गतिशील तरीका नहीं है? – Pete

+2

सैद्धांतिक रूप से एक रनटाइम ऑटो-स्कैन सुविधा है (जेपीए प्रदाता पर निर्भर करता है? मुझे यकीन नहीं है) लेकिन मैंने पाया कि हमेशा काम नहीं करता है। मेरी कंपनी में, मैंने एक मेवेन प्लगइन लिखा, जो कक्षा के दौरान दौड़ने के दौरान युद्ध प्रोजेक्ट में चलाया जाता है, कक्षा वर्ग में एनोटेटेड @ एंटिटी पर सभी वर्गों पर स्वचालित रूप से persistence.xml आधार उत्पन्न करता है। –

+0

अच्छा विचार, कम से कम कुछ हद तक स्वचालित है और यह यूनिट परीक्षण निष्पादन से पहले नवीनतम persistence.xml की आपूर्ति करने में सक्षम होगा। क्या आप अपनी प्लगइन के प्रमुख तत्वों में कुछ पॉइंटर पोस्ट कर सकते हैं? इससे पहले ऐसा नहीं किया है ... (मैं पहले से ही एक दूसरे उपयोग के मामले के बारे में सोच सकता हूं, अर्थात् क्वेरीएसएल के लिए क्वेरी प्रकार बनाना, क्योंकि नवीनतम प्लगइन टूटा हुआ प्रतीत होता है) – Pete

3

कक्षाएं कक्षा लोडर में होंगी।

यह उत्तर Scanning Java annotations at runtime है।

क्या आप चाहते हैं कि? @Entity एनोटेटेड के लिए स्कैन करने के लिए और उन्हें PersistenceUnit पर जोड़ें?

सम्मान।

+0

+1 के रूप में समस्याएं मुझे जल्द ही @PreAuthorize टिप्पणियों के लिए स्कैन करने की आवश्यकता होगी – Pete

+0

@Pete धन्यवाद! Ç – ssedano

3

ठीक है, हम हमारे विकास चक्र पर एक समान समस्या हो रही फिर से '। यदि आपकी संदर्भ संस्थाएं अन्य -जेबीबी में हैं।जार फ़ाइल (है कि हमारे मामला है) आप के साथ

<jar-file>relativePathToYourJar/dependent-entities-ejb.jar</jar-file>

टैग इन संस्थाओं बाध्य कर सकते हैं। ध्यान दें कि आपको persistence.xmldependent-entities-ejb.jar के मेटा-आईएनएफ फ़ोल्डर के तहत भी शामिल करना चाहिए। अधिक जानकारी here मिल सकती है।

0

मैंने टुगसेम जैसे समाधान किए हैं, लेकिन क्योंकि मैं मैवेन का उपयोग कर रहा हूं, मैं अपने persistence.xml में जार संस्करण संख्याओं से नफरत करता हूं। जिस समाधान के साथ मैं आया था, वह यहां वर्णित है: JPA 2.0: Adding entity classes to PersistenceUnit *from different jar* automatically

4

चूंकि सवाल अभी भी ध्यान में आता है, इसलिए मैं समस्या का नवीनतम समाधान पोस्ट करूंगा।

अब हम persistence.xml फ़ाइलों का उपयोग करने के बजाय सभी संकुल ऑटो स्कैनिंग कर रहे हैं।

हमारे datasource.xml में हम लाइन जोड़ा

<property name="packagesToScan" value="our.basepackage" /> 

लगभग पूरा datasource.xml:

<!-- Bean definition here --> 

<bean id="ourDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
      <!-- define connection properties -->  
</bean> 


<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="ourDataSource" /> 
    <property name="packagesToScan" value="our.basepackage" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
      <property name="generateDdl" value="true" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
     </bean> 
    </property> 

</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" /> 

+0

लेकिन जब तक आप अपना आवेदन शुरू नहीं करेंगे तब तक यह मदद नहीं करेगा। आप इस कॉन्फ़िगरेशन का उपयोग कर स्थिर मेटामोडेल उत्पन्न करने में सक्षम नहीं होंगे। – kboom

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