使用弹簧配置(注释优先)的mongodb中的多对多

HVT*_*VT7 7 java many-to-many spring-data-mongodb

我正在建模一个模式.由于我是Mongo DB的新手,我不知道如何建模nosql数据库.构建关系类型db并在其上使用mongo不允许我使用多对多映射.

使用Spring数据确实给许多使用提供了一个支持@DBRef在顶部List<?>.但很多人都是我想要的.

任何帮助将深表感谢.请更喜欢使用代码来解释.或者演示结构来说明.提前致谢.

小智 12

有几种方法可以在MongoDB中实现多对多.

我认为最简单的是:

多对多关系场景:

多对多关系场景

去标准化后:

去标准化后的情况

你的Spring Data代码看起来像这样:

public class Category {

    @Id
    private ObjectId id;

    private String category_name;

    @DbRef
    private List<Product> products_ids;

    // ... getters and setters ...

}

public class Product {

    @Id
    private ObjectId id;

    private String product_name;

    @DbRef
    private List<Category> categories_ids;

    // ... getters and setters ...

}
Run Code Online (Sandbox Code Playgroud)


Mor*_*ang 8

 @marianomdq:你的Spring Data代码应该是这样的:......

当我尝试这个时,将实体保存到数据库没有任何问题.我的问题是再次加载它们.这似乎引起类别的(在这个例子中)负载陷入无限循环类别 - >产品 - >分类 - >机生产线.....直到StackOverflowException异常.

java.lang.StackOverflowError: null
    at java.lang.reflect.Constructor.newInstance(Constructor.java:416) ~[na:1.8.0_77]
    at java.lang.Class.newInstance(Class.java:442) ~[na:1.8.0_77]
    at com.mongodb.DBCollectionObjectFactory.getInstance(DBCollectionObjectFactory.java:51) ~[mongodb-driver-3.2.2.jar:na]
    at com.mongodb.DBObjectCodec.readDocument(DBObjectCodec.java:340) ~[mongodb-driver-3.2.2.jar:na]
    at com.mongodb.DBObjectCodec.decode(DBObjectCodec.java:136) ~[mongodb-driver-3.2.2.jar:na]
    at com.mongodb.DBObjectCodec.decode(DBObjectCodec.java:61) ~[mongodb-driver-3.2.2.jar:na]
    ........
Run Code Online (Sandbox Code Playgroud)

完整的堆栈跟踪非常大.

解决方案:延迟加载数据库引用!

只需将DBRef注释的延迟标志设置为true,这将使加载引用变为惰性.这意味着循环引用不会一次全部加载.

@DBRef(lazy = true)

实际上达到这个解决方案的研究很麻烦.因此,我想分享这些信息.

  • 感谢您分享您的意见!;) (2认同)