Spring boot spring数据redis循环引用

Spring boot spring数据redis循环引用,spring-boot,redis,spring-data,Spring Boot,Redis,Spring Data,您好,我是spring data redis的新手,我有以下循环参考问题: 假设我用java编写了如下代码: 班级人员{ @身份证 私有字符串Id; 私有字符串名称; 私人互联网; @参考文献 私人父亲; @参考文献 私人名单儿童; …二传手和接球手 }让我们从Spring data Redis的工作原理开始 @这里的引用是急切地加载的(SpringDataRedis中还没有延迟加载),所以当您插入父亲的孩子时,您将面临循环依赖,因为孩子将有父亲,而这个父亲将有同一个孩子,而这个孩子有相同的父

您好,我是spring data redis的新手,我有以下循环参考问题: 假设我用java编写了如下代码:

班级人员{
@身份证
私有字符串Id;
私有字符串名称;
私人互联网;
@参考文献
私人父亲;
@参考文献
私人名单儿童;
…二传手和接球手

}
让我们从Spring data Redis的工作原理开始

@这里的引用是急切地加载的(SpringDataRedis中还没有延迟加载),所以当您插入父亲的孩子时,您将面临循环依赖,因为孩子将有父亲,而这个父亲将有同一个孩子,而这个孩子有相同的父亲……等等。下面是一幅更好的图片

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
}
班级人员{
@身份证
私有字符串Id;
私有字符串名称;
私人互联网;
私人字符串父ID;
私人名单儿童;
…二传手和接球手
}
然后修改DAO层,分别获取父级和子级,并附加响应


Redis或大多数其他非关系型数据库的设计都不是为了保持关系(顾名思义),@Reference只应在必要时与具有单向映射的字段一起使用。

让我们从Spring data Redis的工作原理开始

@这里的引用是急切地加载的(SpringDataRedis中还没有延迟加载),所以当您插入父亲的孩子时,您将面临循环依赖,因为孩子将有父亲,而这个父亲将有同一个孩子,而这个孩子有相同的父亲……等等。下面是一幅更好的图片

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
}
班级人员{
@身份证
私有字符串Id;
私有字符串名称;
私人互联网;
私人字符串父ID;
私人名单儿童;
…二传手和接球手
}
然后修改DAO层,分别获取父级和子级,并附加响应


Redis或大多数其他非关系数据库的设计目的都不是保持关系(顾名思义),@Reference只应在必要时与具有单向映射的字段一起使用。

您确定@Id在“private String name”前面吗?@BishwajitPurkaystha post-in代码不是真正的代码,只是为了解释这个想法。。。。让我更新它并将其更改为Id。你确定@Id的前面是“私有字符串名”吗?@BishwajitPurkaystha在代码中的帖子不是真正的代码,只是为了解释这个想法。。。。让我更新一下,把它改成Id。