MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Spring Data Mongo - Làm thế nào để ánh xạ các thực thể POJO kế thừa?

Tôi sẽ trả lời câu hỏi của riêng tôi. Như đã đề cập trong các nhận xét, giải pháp là sử dụng Converter .

Dưới đây là một ví dụ về những gì tôi dự định đạt được với mô hình lớp của mình:

Một Contact có thể là một Person hoặc một Organisation .

Nếu bạn đang sử dụng spring-data-mongodb MongoRepository để ghi dữ liệu vào cơ sở dữ liệu của bạn theo mô hình thực thể của bạn, một _class trường sẽ được thêm vào gốc tài liệu và vào các loại thuộc tính phức tạp (xem phần này ). Các trường này lưu trữ tên đủ điều kiện của lớp Java và nó cho phép định vị khi ánh xạ từ Tài liệu MongoDb sang mô hình dữ liệu Spring.

Nếu ứng dụng của bạn chỉ đọc tài liệu từ cơ sở dữ liệu (không có _class các trường), bạn cần cho dữ liệu Spring biết lớp nào cần khởi tạo khi ánh xạ một Contact . Spring-data cho phép bạn tùy chỉnh hành vi ánh xạ loại mặc định bằng cách sử dụng Converter . Sử dụng Converter rõ ràng ghi đè mặc định ánh xạ cho lớp học . bạn cần lập bản đồ rõ ràng cho toàn bộ lớp của mình. Đây là ví dụ về ContactReadConverter của tôi :

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

Sau đó, các bộ chuyển đổi mới được xác định cần phải được đăng ký:

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

Hy vọng nó sẽ hữu ích.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $ pop

  2. Xử lý các mối quan hệ trong góc sao băng

  3. Tạo _id trên các tài liệu con trên mongoimport --jsonArray

  4. chọn 2 trường và trả về một mảng đã sắp xếp với các giá trị riêng biệt của chúng

  5. Làm cách nào để đổi tên (các) trường bí danh trong khi tìm nạp nó từ MongoDB thông qua truy vấn sử dụng ổ đĩa gốc MongoDB-Node.JS?