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