【问题标题】:spring data redis cyclic referencespring data redis循环引用
【发布时间】:2018-03-22 06:15:45
【问题描述】:

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

我的目标是当一个人的名字被给出时,我想得到一个包含他父亲信息和孩子信息的人对象,这里的信息是指人对象。

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

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

【问题讨论】:

  • 你确定 @Id 被添加到“私有字符串名称”之前吗?
  • @BishwajitPurkaystha 代码中的帖子不是真正的代码,只是为了解释这个想法......让我更新它并将其更改为 Id。

标签: spring-boot redis spring-data


【解决方案1】:

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

@Reference 这里是急切加载的(Spring-Data-Redis 中还没有延迟加载),所以当你插入父亲的孩子时,你将面临循环依赖,因为孩子会有父亲,这个父亲会有同一个孩子有同一个父亲……等等。下图更好

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

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2020-11-07
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2021-01-06
    • 2015-05-17
    相关资源
    最近更新 更多