sql >> Database >  >> NoSQL >> MongoDB

Spring Data Mongo - Hoe overgeërfde POJO-entiteiten in kaart te brengen?

Ik zal mijn eigen vraag beantwoorden. Zoals vermeld in de opmerkingen, is de oplossing om Converter . te gebruiken .

Hier is een voorbeeld van wat ik van plan was te bereiken met mijn klasmodel:

Een Contact kan een Person . zijn of een Organisation .

Als u spring-data-mongodb MongoRepository om gegevens in uw database te schrijven volgens uw entiteitsmodel, een _class veld wordt toegevoegd aan documentroots en aan complexe eigenschapstypen (zie deze sectie ). In deze velden wordt de volledig gekwalificeerde naam van de Java-klasse opgeslagen en kan ondubbelzinnig worden gemaakt bij het toewijzen van MongoDb-document aan Spring-gegevensmodel.

Als uw app zojuist een document uit de database heeft gelezen (geen _class velden), moet u Spring data vertellen welke klasse moet worden geïnstantieerd bij het toewijzen van een Contact . Met Spring-data kunt u het standaard toewijzingsgedrag van het type aanpassen met behulp van Converter . Expliciete Converter gebruiken standaard overschrijven in kaart brengen voor de klas . je moet je hele klas expliciet in kaart brengen. Hier is een voorbeeld van mijn 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;
    }
}

Vervolgens moeten nieuw gedefinieerde converters worden geregistreerd:

@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);
    }
}

Ik hoop dat het helpt.




  1. MongoDB C# - BsonDocument verkrijgen voor een element dat niet bestaat

  2. Verificatiefout bij verbinding met Mongo Atlas vanuit Mule

  3. MongoDB:Hoe een query uit te voeren voor records waarbij het veld null of niet is ingesteld?

  4. een verzameling opvragen zonder het schema in mangoest door te geven