Spring Data Mongodb - repository for collection with different types

后端 未结 2 1290
傲寒
傲寒 2021-01-02 17:34

I have a mongo collection that may contain three types of entities that I map to java types:

  • Node
  • LeafType1
  • LeafType2

Collecti

相关标签:
2条回答
  • 2021-01-02 17:40

    Spring data uses the Repository-Declarations as entry-point when looking for Entity classes (it does not scan packages for entities directly).

    So all you need to do is to declare an "unused" Repository-Interface for your sub-classes, just like you proposed as "unsafe" in your OP:

    public interface NodeRepository extends MongoRepository<Node, String> { 
      // all of your repo methods go here
      Node findById(String id);
      Node findFirst100ByNodeType(String nodeType);
      ... etc.
    }
    public interface LeafType1Repository extends MongoRepository<LeafType1, String> {
      // leave empty
    }
    public interface LeafType2Repository extends MongoRepository<LeafType2, String> { 
      // leave empty
    }
    

    You do not have to use the additional LeafTypeX repositories, you can stick with the NodeRepository for storing and looking up objects of type LeafType1 and LeafType2. But the declaration of the other two repositories is needed, so that LeafType1 and LeafType2 will be found as Entities when initial scanning takes place.

    PS: This all assumes, of course, that you have @Document(collection= "nodes") annotations on your LeafType1 and LeafType2 classes

    0 讨论(0)
  • 2021-01-02 18:02

    If Node\LeafType1\LeafType2 are sub-classes of AbstractMyCollectionNode, then things will be easy. Just declare the repository like you write:

    public interface MyCollectionRepository extends MongoRepository<AbstractMyCollectionNode, String> { }
    

    We have done this in a project, and it works good. Spring Data will add an property named '_class' to the documents in mongodb collection, so that it can finger out which class to instantiate.

    Documents that stored in one collection may have some similarity, maybe you can extract a generic class for them.

    Here are some code copied from one of our projects:

    Entity:

    public abstract class Document {
        private String id;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
        ....
    

    public class WebClipDocument extends Document {
        private String digest;
        ...
    

    Repository:

    public interface DocumentDao extends MongoRepository<Document, String>{
    ...
    

    And, if your documents in mongodb collection does not have the "_class" property. You can use Converter:

    When storing and querying your objects it is convenient to have a MongoConverter instance handle the mapping of all Java types to DBObjects. However, sometimes you may want the `MongoConverter’s do most of the work but allow you to selectively handle the conversion for a particular type or to optimize performance.

    0 讨论(0)
提交回复
热议问题