2012-02-29 12 views
6

मेरे पास एक प्रोजेक्ट सेटअप है जहां मैंने एक प्रोजेक्ट मॉड्यूलर किया है, और एक मॉड्यूल को एक जार फ़ाइल में पैक किया है जो मुख्य परियोजना में शामिल होता है जब हम युद्ध बनाते हैं और इसे तैनात करते हैं। मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि, मेरे पास मॉड्यूल में मौजूद एक इकाई है जो लोड नहीं होती है जब यूनिटनाम के लिए जेपीए कंटेनर एंटीटी मैनेजर फैक्टरी स्टार्टअप के दौरान बनाया जाता है।बाहरी जार फ़ाइल से जेपीए इकाई लोड हो रहा है

मेरे पास मूल प्रश्न है जो persistence.xml पर EntityManager लुकअप नहीं है और फिर निर्दिष्ट गुणों को लोड करता है, और फिर @Entity एनोटेशन के लिए सभी संकुल स्कैन करता है?

यह कैसे काम करता है इस पर कोई अंतर्दृष्टि और मैं इसे कैसे हल कर सकता हूं यह बहुत अच्छा होगा।

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

http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence-units.html

यहाँ मेरी कोड/विन्यास EnitityManagerFactory की

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="LineManagement" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="generateDdl" value="false" /> 
      <property name="showSql" value="false" /> 
      <property name="databasePlatform" ref="cpsHibernateDialectClassName" /> 
     </bean> 
    </property> 
    <property name="beanName" value="entityManager"></property> 
</bean> 

परिभाषा इकाई प्रबंधक प्रारंभ करेंगे तो है।

<persistence-unit name="LineManagement" transaction-type="RESOURCE_LOCAL"> 
    <properties> 
     <property name="hibernate.id.new_generator_mappings" value="true" /> 
     <property name="hibernate.current_session_context_class" value="thread" /> 
     <property name="hibernate.default_batch_fetch_size" value="200" /> 

....

Persistence.xml जो दूसरे स्तर कैश और अन्य हाइबरनेट गुणों को परिभाषित करता।

फिर, मॉड्यूल जिसमें एक इकाई है।

import javax.persistence.Entity; 


@Entity 
@Table(name = IntegrationEvent.TABLE_NAME, uniqueConstraints = @UniqueConstraint(columnNames = "INTGRTN_EVNT_QUEUE_SK")) 
@GenericGenerator(name = "UUID_GEN", strategy = "org.hibernate.id.UUIDHexGenerator",  parameters = { @Parameter(name = "separator", value = "-") }) 
public class IntegrationEvent implements Serializable { 

.... }

नोट: इकाई, माता पिता से एक अलग पैकेज में है, क्योंकि यह अपने आप ही एक अलग मॉड्यूल है।

वह इकाई जो मुख्य परियोजना में जुर्माना लोड करती है।

package com.parent.line.entity; 

import javax.persistence.Entity; 

@Entity 
@Table(name = "ACCOUNT") 
@Cacheable(true) 
public class Account 
    implements LMLookupTypeEntityByDivision, Serializable, Comparable<Account> { 
+1

समस्या यह थी क्योंकि मेरे मॉड्यूल को मेरे मूल प्रोजेक्ट पर निर्भरता के रूप में जोड़ा गया था क्योंकि यह पूरी तरह अलग है। इसलिए इसे मेरे वेब-आईएनएफ/lib फ़ोल्डर में रखा जाएगा। जेपीए कोड को डीबग करने के बाद, जहां यह इकाइयों को लोड करता है, मुझे एहसास हुआ कि क्लासपाथ जहां @ एन्टीटी एनोटेशन के लिए स्कैनिंग शुरू होती है वह वेब-आईएनएफ/कक्षाओं से थी। जो समझ में आता है, क्योंकि lib केवल पढ़ा जाता है। अब, मुझे कक्षा फ़ोल्डर में मॉड्यूल जोड़ने या persistence.xml में टैग का उपयोग करने के बारे में सोचना है ताकि जार इकाई को स्कैन और लोड किया जा सके। – Hrishikesh

उत्तर

4

जार में रहने वाली संस्थाओं को स्कैन करने के लिए, आपको इसे persistence.xml में शामिल करना होगा। <jar-file>packedEntity.jar</jar-file>

यदि आप पैकेज से यूनिट लोड करना चाहते हैं, तो आप सीधे इसे जार से इंजेक्शन देने का प्रयास कर सकते हैं। @PersistenceContext(unitName = "../packedEntity.jar#main")

की कोशिश की है नहीं, लेकिन आप संस्थाओं <property name="hibernate.archive.autodetection" value="class, hbm"/>

1

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

उपयोग किया जाने वाला समाधान जावा एसपीआई का प्रयोग करें। सर्विसलोडर कोर इंटरफ़ेस EntityProvider को लागू करने वाले वर्गों की तलाश करेगा। प्रत्येक मॉड्यूल का प्रत्येक EntityProvider सेवा loader.load (EntityProvider.class) को कॉल करते समय इकाइयों की एक सूची को हार्डकोड करेगा और इकाइयों की एक सूची वापस करेगा। इस प्रकार प्लेटफ़ॉर्म कोर में हमें बस एक वसंत आधारित सत्र कारखाना बनाने की आवश्यकता है जिसमें हम एक फैक्ट्री बीन द्वारा संस्थाओं की सूची प्रदान करते हैं जो एसपीआई को कॉल करेगा।

मुझे नहीं पता कि यह जेपीए के साथ आसान होगा या नहीं, लेकिन मुझे पूरा यकीन है कि यह संभव है लेकिन आपको वसंत संदर्भ से मैन्युअल रूप से ईएमएफ बनाने की आवश्यकता हो सकती है, और दृढ़ता से मुझे लगता है कि ... आप क्या कर सकते हैं चाहते हैं एक दृढ़ता इकाई है जो आपके सभी मॉड्यूल (कम से कम अपनी इकाइयों के लिए) की दृढ़ता इकाइयों का "विलय" है एसपीआई और javax.persistence.spi पैकेज पर एक नज़र डालें।

भी चेक कैसे स्प्रिंग के साथ एक EMF बनाने के लिए: AbstractEntityManagerFactoryBean

संपादित करें: आप इस जाँच कर सकते हैं: using the MergingPersistenceUnitManager to load entity

0

आप वसंत बूट आपका मुख्य springboot कक्षा में इकाई एनोटेशन स्कैन का उपयोग उपयोग कर रहे हैं

@EntityScan(
     basePackageClasses = {externalpackage.classname.class} 
) 
संबंधित मुद्दे