2014-12-22 7 views
10

में स्प्रिंग डेटा कॉन्फ़िगर किए गए इकाई प्रबंधक (फैक्ट्री) तक कैसे पहुंचे I स्प्रिंग डेटा जेपीए रिपोजिटरी के लिए एक कस्टम कार्यान्वयन लिख रहा हूं। तो मेरे पास है:कस्टम कार्यान्वयन

  • MyEntityRepositoryCustom =>
  • MyEntityRepositoryUmpl => ऊपर इंटरफ़ेस के कार्यान्वयन कस्टम तरीकों के साथ इंटरफेस
  • MyEntityRepository => जो JpaRepository और MyEntityRepositoryCustom

मेरे समस्या फैली मानक इंटरफेस यह है: MyEntityRepositoryUmpl के कार्यान्वयन के भीतर मुझे स्प्रिंग डेटा में इंजेक्शन वाले इकाई प्रबंधक तक पहुंचने की आवश्यकता है। इसे कैसे प्राप्त करें? मैं इसे @PersistenceContext का उपयोग कर इसे प्राप्त करने के लिए उपयोग कर सकता हूं, लेकिन समस्या यह है कि इस भंडार को एक ऐसे अनुप्रयोग में काम करना चाहिए जो एक से अधिक दृढ़ता इकाइयों को स्थापित करता हो। तो, स्प्रिंग को बताने के लिए जो मुझे चाहिए, मुझे @PersistenceContext(unitName="myUnit") का उपयोग करना होगा। हालांकि, चूंकि मेरी रिपॉजिटरीज को पुन: प्रयोज्य सेवा परत में परिभाषित किया गया है, इसलिए मुझे उस बिंदु पर पता नहीं चल सकता कि दृढ़ता इकाई का नाम क्या होगा जो उच्च-स्तरीय अनुप्रयोग परत को मेरे भंडारों में इंजेक्शन देने के लिए कॉन्फ़िगर किया जाएगा।

दूसरे शब्दों में, मुझे क्या करना होगा कि स्प्रिंग डेटा का उपयोग करने वाले इकाई प्रबंधक तक पहुंचने के लिए, लेकिन एक (इतनी जल्दी नहीं) के बाद स्प्रिंग डेटा जेपीए दस्तावेज को देखने के बाद मुझे इसके लिए कुछ भी नहीं मिला।

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

उत्तर

4

सबसे अच्छा मैं मिल सकता है एक "सम्मेलन" स्थापित करने के लिए है: मेरे खजाने घोषणा करते हैं कि वे एक हठ इकाई की उम्मीद उपलब्ध कराए जाने के लिए myConventionalPU नामित किया गया। तब एप्लिकेशन लेयर उस इकाई प्रबंधक फैक्ट्री को उपनाम निर्दिष्ट करता है जो इसे सेट करता है और स्प्रिंग डेटा में इंजेक्ट करता है, इसलिए मेरे कस्टम कार्यान्वयन को उस उपनाम का उपयोग करके स्वत: नौकरी के साथ सही ईएमएफ प्राप्त हो सकता है। यहाँ अपने आवेदन संदर्भ का एक अंश है:

<bean id="myEntityManagerFactory" name="myConventionalPU" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    [...] 
</bean> 

<jpa:repositories base-package="com.example" 
    entity-manager-factory-ref="myEntityManagerFactory" 
    transaction-manager-ref="transactionManager" /> 

और मेरे कस्टम कार्यान्वयन के भीतर:

@PersistenceContext(unitName = "myConventionalPU") 
private EntityManager em; 

मैं इस आवश्यकता का DATAJPA-669 खोला।

3

स्प्रिंग डेटा जेपीए स्वत: उत्पन्न करने के लिए ऑटो कॉन्फ़िगरेशन कक्षाओं का उपयोग करता है ManagerFactory, डेटा स्रोत और लेनदेन प्रबंधक।

यदि आप इकाई प्रबंधक तक पहुंच प्राप्त करना चाहते हैं और तत्काल और सेटिंग्स को नियंत्रित करना चाहते हैं, तो आपको अपनी खुद की दृढ़ता कॉन्फ़िगरेशन को परिभाषित करने की आवश्यकता है। नीचे जावा कॉन्फ़िग

@Configuration 
    @EnableTransactionManagement 
    @EnableJpaRepositories(basePackages = { "com.test.repositories.*" }) 
    public class PersistenceJpaConfig { 

     @Autowired 
     JpaVendorAdapter jpaVendorAdapter; 

     @Bean 
     public DataSource dataSource() { 
      return new EmbeddedDatabaseBuilder() 
        .setName("testdb") 
        .setType(EmbeddedDatabaseType.HSQL) 
        .build(); 
     } 

     @Bean 
     public EntityManager entityManager() { 
      return entityManagerFactory().createEntityManager(); 
     } 

     @Bean 
     public EntityManagerFactory entityManagerFactory() { 
      LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); 
      lef.setDataSource(dataSource()); 
      lef.setJpaVendorAdapter(jpaVendorAdapter); 
      lef.setPackagesToScan("com.test.domain.*"); 
      lef.afterPropertiesSet(); 
      return lef.getObject(); 
     } 

     @Bean 
     public PlatformTransactionManager transactionManager() { 
      return new JpaTransactionManager(entityManagerFactory()); 
     } 
    } 

का उपयोग कर आप एकाधिक डेटा स्रोतों है, तो नमूना कोड, follow this article.

+0

मैं जानता हूँ कि कैसे कॉन्फ़िगर स्प्रिंग डेटा संग्रह (मैं जावा config पर XML पसंद करते हैं, BTW) करते हैं, समस्या मैं एक कस्टम कार्यान्वयन अंदर से पता नहीं क्या कर सकते हैं स्प्रिंग डाटा को इंजेक्ट किया गया है, जब तक कि मैं "हार्ड कोड" इसमें उस दृढ़ता इकाई का ज्ञान उपयोग में होगा। –

15

संस्करण स्प्रिंग डेटा जेपीए 1.9.2 के बाद से आप JpaContext के माध्यम से EntityManager तक पहुंच सकते हैं, देखें: http://docs.spring.io/spring-data/jpa/docs/1.9.2.RELEASE/reference/html/#jpa.misc.jpa-context। उदाहरण:

@Component 
public class RepositoryUtil 
{ 
    @Autowired 
    private JpaContext jpaContext; 

    public void deatach(T entity) 
    { 
     jpaContext.getEntityManagerByManagedType(entity.getClass()).detach(entity); 
    } 
} 

पीएस यह दृष्टिकोण काम नहीं करेगा यदि आपके पास कुछ कक्षाओं के लिए एक से अधिक EntityManager उम्मीदवार है, तो JpaContext # getEntityManagerByManagedType -> DefaultJpaContext # getEntityManagerByManagedType के कार्यान्वयन को देखें।

+1

हाँ, यह JIRA मुद्दा [DATAJPA-669] (https://jira.spring.io/browse/DATAJPA-669) मैं इस के लिए खोला गया का परिणाम है। फिर भी सोच क्यों एक सरल 'getEntityManager()' 'JpaRepository' में विधि प्रदान नहीं किया गया है, यह कोई अस्पष्टता पड़ता था। मैंने उस जिरा मुद्दे में इस पर एक टिप्पणी जोड़ा। –

+1

इसके समाधान के बाद jira मुद्दा DATAJPA-669 के रूप में स्वीकार जवाब होना चाहिए नहीं है? – yaswanth

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