在mongodb中使用弹簧配置(注释预置)的多对多

2022-09-04 05:38:01

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

使用 Spring-data 确实为在 .但很多对多是我想要的。@DBRefList<?>

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


答案 1

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

我认为最简单的是以下几点:

多对多关系方案:

Many-To-Many Relational scenario

去规范化后:

After de-normalization scenario

你的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 ...

}

答案 2

@marianomdq:你的Spring Data代码应该看起来像这样:...

当我尝试这样做时,没有任何问题,无论将实体保存到数据库中。我的问题是再次加载它们。这似乎会导致(在此示例中)类别的负载落入无限循环类别 -> 产品 -> 类别 -> Produ.....直到抛出 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]
    ........

完整的堆栈跟踪是超级大的。

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

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

@DBRef(lazy = true)

实际获得此解决方案的研究很麻烦。因此,我想分享这些信息。


推荐