MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

स्प्रिंग डेटा मोंगो - विरासत में मिली पीओजेओ इकाइयों को कैसे मैप करें?

मैं अपने प्रश्न का उत्तर स्वयं दूंगा। जैसा कि टिप्पणियों में बताया गया है, समाधान Converter . का उपयोग करना है ।

यहां एक उदाहरण दिया गया है कि मैं अपने वर्ग मॉडल के साथ क्या हासिल करना चाहता हूं:

एक Contact या तो एक Personहो सकता है या एक Organisation .

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

यदि आपका ऐप सिर्फ डेटाबेस से दस्तावेज़ पढ़ता है (कोई _class . नहीं फ़ील्ड), आपको स्प्रिंग डेटा को यह बताना होगा कि Contact mapping को मैप करते समय किस वर्ग को इंस्टेंट करना है . स्प्रिंग-डेटा आपको Converter . का उपयोग करके डिफ़ॉल्ट प्रकार के मानचित्रण व्यवहार को अनुकूलित करने की अनुमति देता है . स्पष्ट Converter का उपयोग करना डिफ़ॉल्ट ओवरराइड करें कक्षा के लिए मानचित्रण . आपको अपनी पूरी कक्षा को स्पष्ट रूप से मानचित्रित करने की आवश्यकता है। मेरे ContactReadConverter . का एक उदाहरण यहां दिया गया है :

@ReadingConverter
public class ContactReadConverter implements Converter<Document, Contact> {

    @Override
    public Contact convert(Document source) {
        if (source.get("firstName") == null) {
            Organisation organisation = new Organisation();
            I18n name = new I18n();
            name.setEn(source.get("name", Document.class).get("en", String.class));
            name.setFr(source.get("name", Document.class).get("fr", String.class));
            organisation.setName(name);
            organisation.setAcronym(source.get("acronym", String.class));
            organisation.setRole(source.get("role", String.class));
            return organisation;
        }
        Person person = new Person();
        person.setFirstName(source.get("firstName", String.class));
        person.setLastName(source.get("lastName", String.class));
        person.setRole(source.get("role", String.class));
        person.setEmail(source.get("email", String.class));
        person.setOrcId(source.get("orcId", String.class));
        if (source.get("organisation") != null) {
            Document sourceOrg = source.get("organisation", Document.class);
            Organisation organisation = new Organisation();
            organisation.setAcronym(sourceOrg.get("acronym", String.class));
            organisation.setRole(sourceOrg.get("role", String.class));
            if (sourceOrg.get("name") != null) {
                I18n name = new I18n();
                name.setFr(sourceOrg.get("name", Document.class).get("fr", String.class));
                name.setEn(sourceOrg.get("name", Document.class).get("en", String.class));
                organisation.setName(name);
            }
            person.setOrganisation(organisation);
        }
        return person;
    }
}

फिर, नए परिभाषित कन्वर्टर्स को पंजीकृत करने की आवश्यकता है:

@Configuration
public class DataportalApplicationConfig extends AbstractMongoConfiguration {
    @Value("${spring.data.mongodb.uri}")
    private String uri;
    @Value("${spring.data.mongodb.database}")
    private String database;
    @Override
    public MongoClient mongoClient() {
        return new MongoClient(new MongoClientURI(uri));
    }
    @Override
    protected String getDatabaseName() {
        return database;
    }    
    @Bean
    @Override
    public MongoCustomConversions customConversions() {
        List<Converter<?, ?>> converterList = new ArrayList<>();
        converterList.add(new ContactReadConverter());
        return new MongoCustomConversions(converterList);
    }
}

आशा है कि यह मदद करता है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला - प्रत्येक उपयोगकर्ता से अंतिम संदेश खोजें

  2. MongoDB प्रोजेक्शन में एक स्ट्रिंग को एक संख्या में बदलें

  3. चहचहाना क्लोन के लिए सर्वश्रेष्ठ MongoDB स्कीमा?

  4. MongoDB - नेस्टेड फ़ील्ड के साथ समूह समग्र कुंजी

  5. मोंगोडीबी स्वचालित रूप से डेटा रीफ्रेश नहीं करता है?