Spring mongodb dbref一对多如何实现
Spring mongodb dbref one to many how implement
@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);
当我试图让两个用户之一挂起程序时,
我认为这是因为:
用户一加载了包含用户二的列表,但用户二包含列表,用户一包含该用户的列表,最后我有循环。
为 link 两个对象创建附加文档的最佳方法是什么???
如果您的文档有一个 DBRef
,那么当它被加载时,任何 DBRef
引用的所有文档也会被加载。
所以如果 User one
有一个 DBRef
到 User two
User two
有 DBRef
到 User one
结果将是一个无限循环(导致您挂起)。
即一载二,二载一,二载二...
(1 -> 2 -> 1 -> 2 -> 1 -> 2)
虽然我想不出你在任何情况下都想要这个的原因,但可以使用一种称为 Manual Referencing
.
的技术来实现这种引用
这基本上意味着包括与任何其他用户关联的任何用户的 _id。这样,当您加载一个用户时,您只加载一个字符串列表,该列表可用于从数据库中加载每个用户。
注意:如果删除用户,则必须在 "userReference" 字段中找到该用户的所有匹配项并将其删除。
@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);
当我试图让两个用户之一挂起程序时, 我认为这是因为: 用户一加载了包含用户二的列表,但用户二包含列表,用户一包含该用户的列表,最后我有循环。 为 link 两个对象创建附加文档的最佳方法是什么???
如果您的文档有一个 DBRef
,那么当它被加载时,任何 DBRef
引用的所有文档也会被加载。
所以如果 User one
有一个 DBRef
到 User two
User two
有 DBRef
到 User one
结果将是一个无限循环(导致您挂起)。
即一载二,二载一,二载二...
(1 -> 2 -> 1 -> 2 -> 1 -> 2)
虽然我想不出你在任何情况下都想要这个的原因,但可以使用一种称为 Manual Referencing
.
这基本上意味着包括与任何其他用户关联的任何用户的 _id。这样,当您加载一个用户时,您只加载一个字符串列表,该列表可用于从数据库中加载每个用户。
注意:如果删除用户,则必须在 "userReference" 字段中找到该用户的所有匹配项并将其删除。