弹簧数据redis循环参考

时间:2017-10-10 18:27:39

标签: spring-boot redis spring-data

您好我是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;
&#13;
&#13;

我的目标是,当一个人的名字被给出时,我希望得到一个具有父亲信息和儿童信息的人物,我所说的信息就是人物。

我所看到的问题是这里有一个循环引用,因为给出姓名的人包含在他父亲的孩子名单中,所以它实际上引用了自己,因此形成了一个圆圈。

我的问题是实现目标的最佳方法是什么?

1 个答案:

答案 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仅应与具有单向映射的字段(如有必要)一起使用。