我正在建模一个模式.由于我是Mongo DB的新手,我不知道如何建模nosql数据库.构建关系类型db并在其上使用mongo不允许我使用多对多映射.
使用Spring数据确实给许多使用提供了一个支持@DBRef
在顶部List>
.但很多人都是我想要的.
任何帮助将深表感谢.请更喜欢使用代码来解释.或者演示结构来说明.提前致谢.
@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] ........
完整的堆栈跟踪非常大.
解决方案:延迟加载数据库引用!
只需将DBRef注释的延迟标志设置为true,这将使加载引用变为惰性.这意味着循环引用不会一次全部加载.
@DBRef(lazy = true)
实际上达到这个解决方案的研究很麻烦.因此,我想分享这些信息.
有几种方法可以在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 ... }