2013-05-14 5 views
11

मेरे पास दो Entitymanager बीन कॉन्फ़िगरेशन हैं। प्रत्येक एक अलग स्कीमा के साथ एक अलग डेटाबेस को इंगित करता है (एक ओरेकल है, दूसरा एक इन-मेमोरी एच 2 है)स्प्रिंग डेटा जेपीए: एकाधिक डेटाबेस/एंटीटीमेंजर कॉन्फ़िगरेशन के लिए रिपोजिटरीज

प्रत्येक रिपोजिटरी के लिए एंटीटीमेनगर का उपयोग करने की अस्पष्टता को हल करने के लिए मैं क्या कर सकता हूं? बस की तरह

<jpa:repositories base-package="com.foo.repos.ora" 
entity-manager-factory-ref="entityManagerFactoryA"> 

<jpa:repositories base-package="com.foo.repos.m2" 
entity-manager-factory-ref="entityManagerFactoryB"> 

कुछ का उपयोग करके

No unique bean of type [javax.persistence.EntityManagerFactory] is defined: 
expected single bean but found 2 

मुझे लगता है मैं एक त्वरित ठीक प्रदान कर सकता है लेकिन उम्मीद है कि वहाँ एक बेहतर समाधान है: अभी मैं इस त्रुटि हो रही है।

संपादित करें:

वसंत-कॉन्फ़िग:

मैं तुम्हें मौजूदा परिदृश्य की जानकारी देने के वहाँ हो दो ईएम

<jpa:repositories base-package="com.foo.repos.ora" entity-manager-factory-ref="entityManagerFactory"/> 
<jpa:repositories base-package="com.foo.repos.m2" entity-manager-factory-ref="entityManagerFactory2"/> 
<context:component-scan base-package="com.foo" /> .... 

सब कुछ यहां से पर "पैकेज में है com.foo.repos.ora " how to make a custom repository के पैटर्न के बाद मुझे दो इंटरफेस 'एआरपोजिटरी', 'एआरपोजिटरी कस्टम' और इसके कार्यान्वयन 'एआरपोजिटरीआईएमएलएल' जैसे

@Repository 
public interface ARepository extends ARepositoryCustom, JpaRepository<myEntity, BigDecimal>, QueryDslPredicateExecutor { 

} 

public interface ARepositoryCustom { 
    FooBar lookupFooBar() 
} 

public class ARepositoryImpl extends QueryDslRepositorySupport implements ARepositoryCustom { 
    ARepositoryImpl(Class<?> domainClass) { 
     super(domainClass.class) 
    } 

    ARepositoryImpl() { 
     this(myEntity.class) 
    } 

    @Override 
    FooBar lookupFooBar() { 
     JPQLQuery query = .... 
     .... 
     return found 
    } 
} 

निम्न त्रुटि संदेश में जिसके परिणामस्वरूप:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'aRepositoryImpl': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2

कौन सा निश्चित रूप से सही है, वहाँ 2 ईएम सेम कर रहे हैं, लेकिन जब से मैं ईएम # प्रतिबंधित 1 उर्फ ​​'entityManagerFactory' 'com.foo पैकेज .repos.ora 'केवल, मुझे अभी भी यकीन नहीं है कि सटीक ईएम बीन का संदर्भ कैसे लें।

उत्तर

13

हुड के नीचे कोई जादू नहीं है।

<jpa:repositories base-package="com.foo.repos.ora" entity-manager-factory-ref="entityManagerFactory"/> 

आपके कस्टम इंटरफ़ेस कार्यान्वयन के साथ आपकी सहायता नहीं करता है। मैंने पाया कि सबसे अच्छा तरीका नियमित रूप से बीन्स के रूप में आपके कस्टम कार्यान्वयन का इलाज करना है। इसलिए मैं तो

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     ... 
</bean> 
<bean id="sharedEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
     <property name = "entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

उसके बाद की तरह मेरे वसंत विन्यास में एक 'sharedEntitManager' सेम परिभाषित, मैं बस मेरी कार्यान्वयन बीन्स में EntityManager इंजेक्शन

<bean id="aRepositoryImpl" class="comm.foo.repos.ora.ARepositoryImpl"> 
    <property name="entityManager" ref="sharedEntityManager"/> 
</bean> 

'इकाई प्रबंधक-कारखाने में रेफरी' विशेषता विभिन्न इकाई प्रबंधक कारखानों के बीच भेदभाव करती है लेकिन केवल सीधे वसंत डेटा रिपोजिटरीज (यानी केवल इंटरफेस के लिए) के लिए। हालांकि यह आपके किसी भी कार्यान्वयन के साथ खुद को चिंता नहीं करता है।

यह निष्कर्ष निकालने के लिए

1) अगर आप बस कोई कस्टम कार्यान्वयन के साथ मानक स्प्रिंग डाटा खजाने पर भरोसा करते हैं, डेटाबेस अंतर करने के लिए "इकाई प्रबंधक-कारखाने में रेफरी" विशेषता का उपयोग करें।

2 ए) इसके अतिरिक्त, यदि आप किसी भी कस्टम कार्यान्वयन का उपयोग करते हैं, तो उपयुक्त EntityManager को लागू करने वाले वर्ग में सीधे इंजेक्ट करें। वायरिंग आपके वसंत एक्सएमएल विन्यास के नियंत्रण में किया जाता है। किसी कारण से मैं सही EntityManager का संदर्भ देने के लिए @Autowire एनोटेशन के साथ @Autowire एनोटेशन का उपयोग करने में सक्षम नहीं था।संपादित मैं बस का चयन क्या EntityMAnger इस्तेमाल किया जाना चाहिए हाथ में @Resource एनोटेशन के बारे में सीखा

@Resource(name = "sharedEntityManagerA") 
EntityManager entityManager 


<bean id="sharedEntityManagerA" name="sharedEntityManagerA" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
     <property name = "entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 
इस के साथ

सीधा हो जाता है। आपके संदर्भ xml में सभी चीज़ों को नलसाजी करने की आवश्यकता नहीं है।

2b) अपना सामान ऊपर hooking के लिए वसंत के एक्सएमएल विन्यास के लिए एक विकल्प के रूप में आप भी

@PersistenceContext(unitName = "nameOfPersistenceUnit")

साथ सही EntitymanagerFactory

जबकि अपने हठ करने के लिए 'nameOfPersistenceUnit' referes में बैठे इंजेक्षन लिए जा सकते हैं अपने मानक जेपीए persistence.xml

हालांकि 2 बी) 'QueryDslRepositorySupport' के साथ अच्छी तरह से नहीं जाता है, क्योंकि यह EntityManager उदाहरण की अपेक्षा करता है। लेकिन मैंने पाया कि 'QueryDslRepositorySupport' वैसे भी बहुत अधिक समर्थन प्रदान नहीं करता है, इसलिए मैंने इसे हटा दिया।

+0

2 बी) यदि आपके पास दो 'लोकलकॉन्टेनर एंटीटी मैनेजर फैक्ट्रीबीन' आपके आवेदन संदर्भ में हैं, तो प्रत्येक के अपने 'दृढ़ता UnitName' के साथ एक आकर्षण की तरह काम करता है। –

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