您好我是Spring数据redis的新手,并且我有以下循环引用问题: 说我在java中的代码看起来像:
class Person{
@Id
private String Id;
private String name;
private int age;
@Reference
private Person father;
@Reference
private List<Person> children;
... setters and getters
}
&#13;
我的目标是,当一个人的名字被给出时,我希望得到一个具有父亲信息和儿童信息的人物,我所说的信息就是人物。
我所看到的问题是这里有一个循环引用,因为给出姓名的人包含在他父亲的孩子名单中,所以它实际上引用了自己,因此形成了一个圆圈。
我的问题是实现目标的最佳方法是什么?
答案 0 :(得分:0)
让我们从Spring-data-Redis的工作方式开始
@Reference的加载非常迫切(Spring-Data-Redis中没有延迟加载),因此,当您插入父亲的孩子时,您将面临循环依赖,因为Child将拥有父亲,而此父亲将拥有相同的孩子,有同一个父亲..等等。下面是更好的图片
Person
{
name: Rob,
father: ...
childrens: [ {
Person{
name: Sam
father: [ {
Person
{
name: Rob,
father: ...
childrens: [ {
Person{
name: Sam
father: [ {
............
..................
......................
............................
Repeating this relation...
}]
}
} ]
}
}]
}
} ]
}
这将创建循环依赖项,因为Java将继续递归映射父子关系,从而导致内存溢出,这正是您应避免的情况。
解决方案:
抛弃@Reference并保留父亲和儿子的ID,如下所示
class Person{
@Id
private String Id;
private String name;
private int age;
private String fatherId;
private List<String> childrensIds;
... setters and getters
}
然后修改DAO层以分别获取父级和子级,并作为响应进行附加。
Redis或大多数其他非关系数据库都不旨在保持关系(顾名思义),并且@Reference仅应与具有单向映射的字段(如有必要)一起使用。