gpt4 book ai didi

spring-boot - spring 数据 redis 循环引用

转载 作者:可可西里 更新时间:2023-11-01 10:54:30 26 4
gpt4 key购买 nike

您好,我是 spring data 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
}

我的目标是,当给出一个人的名字时,我想得到一个包含他父亲信息和 child 信息的人对象,我所说的信息是指人对象。

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

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

最佳答案

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

这里的@Reference 是急切加载的(Spring-Data-Redis 中还没有延迟加载),所以当你插入父亲的 child 时,你将面临循环依赖,因为 child 将拥有父亲,而这个父亲将拥有同一个 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 层以分别获取 Father 和 Children 并作为响应附加。

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

关于spring-boot - spring 数据 redis 循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com