Spring Data Mongodb-用于收集不同类型的存储库

发布于 2021-01-30 16:17:59

我有一个mongo集合,其中可能包含我映射到Java类型的三种类型的实体:

  • 节点
  • LeafType1
  • LeafType2

收集是使用父条目中的子节点的dbRefs存储树状结构。

我没有在Spring参考文档中找到有关主题的任何信息,所以我在这里问:有没有一种方法可以使用Repository机制来处理可能包含不同类型对象的集合?

在一个集合中声明多个用于不同类型的存储库似乎不是一个好主意,因为我经常遇到以下情况:查询的对象不是预期类型,并且为抽象类创建一个所有可能的类型继承都不起作用的存储库。

为了说明我的意思:

/**
 * This seems not safe
 */
public interface NodeRepository extends MongoRepository<Node, String> { }
public interface LeafType1Repository extends MongoRepository<LeafType1, String> { }
public interface LeafType2Repository extends MongoRepository<LeafType2, String> { }

/**
 * This doesn't work at all
 */
public interface MyCollectionRepository extends MongoRepository<AbstractMyCollectionNode, String> { }
关注者
0
被浏览
106
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    如果Node \ LeafType1 \
    LeafType2是AbstractMyCollectionNode的子类,那么事情将会很容易。只需像编写时那样声明存储库:

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

    我们已经在一个项目中做到了这一点,并且效果很好。Spring Data将在mongodb集合中的文档中添加一个名为“
    _class”的属性,以便可以指出要实例化的类。

    存储在一个集合中的文档可能有一些相似之处,也许您可​​以为它们提取一个通用类。

    以下是从我们的项目之一复制的一些代码:

    实体:

    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;
        ...
    

    仓库:

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

    并且 ,如果您的mongodb集合中的文档不具有“
    _class”属性。您可以使用Converter

    在存储和查询对象时,让MongoConverter实例处理所有Java类型到DBObjects的映射很方便。但是,有时您可能希望MongoConverter完成大部分工作,但允许您有选择地处理特定类型的转换或优化性能。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看