Java 使用spring配置的mongodb中的多对多(注释优先)

Java 使用spring配置的mongodb中的多对多(注释优先),java,many-to-many,spring-data-mongodb,Java,Many To Many,Spring Data Mongodb,我正在为一个模式建模。由于我是Mongo DB的新手,我不知道如何对nosql DB建模。 构造关系类型db并在其上使用mongo不允许我使用多对多映射 使用Spring数据确实支持在列表的顶部使用@DBRef。但多对多是我想要的 任何帮助都将不胜感激。请更喜欢使用代码来解释。或者用演示结构来说明。提前感谢。在MongoDB中有几种实现多对多的方法 我认为最简单的是: 多对多关系场景: public class Category { @Id private ObjectId i

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

使用Spring数据确实支持在
列表的顶部使用
@DBRef
。但多对多是我想要的


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

在MongoDB中有几种实现多对多的方法

我认为最简单的是:

多对多关系场景:

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

}

反规范化后:

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

}

您的Spring数据代码应该如下所示:

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

}
公共类类别{
@身份证
私有ObjectId;
私有字符串类别名称;
@DbRef
私有列表产品\u id;
//…能手和二传手。。。
}
公共类产品{
@身份证
私有ObjectId;
私有字符串产品名称;
@DbRef
私有列表类别\u id;
//…能手和二传手。。。
}
@marianomdq: 您的Spring数据代码应该如下所示:

当我尝试这样做时,将实体保存到数据库中并没有任何问题。我的问题是再次加载它们。这似乎会导致(在本例中)类别的负载落入一个无限循环Category->Product->Category->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]
    ........
完整的stacktrace非常大

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

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

@DBRef(lazy=true)


要真正找到这个解决方案的研究是很麻烦的。因此,我想分享这些信息。

谢谢分享您对此的意见!;)尽管pivot集合也应帮助存储和保存元数据以及有关类别和产品之间关系的任何必要信息。我们怎么会这样?