0
    @Document(collection = "users")
    public class User {

        @Id
        private String id;

        @DBRef(lazy = true)
        private Set<User> following = new HashSet<>();
}

例如,我会这样想

User one = new User();
User two = new User();
one.follow(two);
userRepository.save(one);

此刻,一切正常。但在那之后

two.follow(one);
userRepository.save(two);

当我尝试获取已挂起程序的两个用户之一时,我认为它的原因是:用户一加载了包含用户二的列表,但用户二包含用户一的列表,其中包含该用户的列表,最后我有循环。最好的方法是为链接两个对象创建额外的文档???

4

1 回答 1

0

如果您的文档在加载时具有then ,那么任何'sDBRef引用的所有文档也是如此。DBRef

所以 if User onehas a DBReftoUser twoUser twohas a DBReftoUser one

结果将是一个无限循环(导致您挂起)。

即一个加载两个,两个然后加载一个,然后加载两个......

(1 -> 2 -> 1 -> 2 -> 1 -> 2)

尽管我想不出在任何情况下都想要这个的原因,但可以使用一种称为Manual Referencing.

这基本上意味着包括与任何其他用户关联的任何用户的 _id。这样,当您加载用户时,您只需加载一个字符串列表,该列表可用于将每个用户加载出数据库。

注意:如果您删除一个用户,您必须在“userReference”字段中找到该用户的所有出现并删除它们。

于 2016-03-03T13:13:40.233 回答