【问题标题】:Infinite recursion issue with @DBRef (lazy = true)@DBRef 的无限递归问题(lazy = true)
【发布时间】:2017-05-21 04:33:54
【问题描述】:

我有以下课程:

public class Person
{
    @Id
    ObjectId Id;

    String name;

    @DBRef(lazy = true)
    List<Entity> entities;

    /* Getters and setters omitted for brevity. */
}



public class Entity
{
    @Id
    ObjectId Id;

    String entityName;

    @DBRef(lazy = true)
    List<Person> people;

    /* Getters and setters omitted for brevity. */
}

现在,由于某种原因,当我尝试使用这些链接时,我遇到了一个无限循环......我认为lazy = true 阻止了这种情况,有人知道我做错了什么吗?

【问题讨论】:

    标签: java spring mongodb spring-data spring-data-mongodb


    【解决方案1】:

    Spring Data Mongo 上存在一个问题,该问题讨论了默认情况下使 DbRefs 惰性化以避免此类堆栈溢出的选项。它还提到了触发相同无限递归的另外两个问题:

    只有当 DBRef 被放置在构造函数中时,才会发生 StackOverflow 异常。

    不确定“唯一”是否是错字。和

    如果有人在其@Document 实体中覆盖了 Object 的方法(“equals”、“hashCode”或“toString”),这可能会触发 DBRef 的解析

    因此,您的问题的一个可能原因是,其他东西正在触发递归解决方案。

    您可以通过检查堆栈跟踪的顶部找到罪魁祸首。

    更新

    根据您的评论,这似乎与 Spring Data 无关,而是 Jackson 的问题。

    实际上有关于如何解决这个问题的答案。这对我来说听起来很有希望https://stackoverflow.com/a/4126846/66686

    【讨论】:

    • 嘿!所有的堆栈跟踪信息似乎都提到了杰克逊。我实际上所做的只是一个实体的插入和一个人的插入。 Insert 在完成后将创建的实例(带有 Id 等)返回给我......然后我将实体添加到 Person 实例中的实体列表中,并将 Person 添加到 Entity 中的人员列表中,并对两者进行保存。在这一点上,它似乎疯了......我做错了吗?
    • 听起来 Spring Data Mongo 运行良好。但是你遇到了杰克逊的问题。用可能的解决方案的链接更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多