用杰克逊反序列化时识别相等的对象

问题描述

我正在使用杰克逊作为json反序列化器来构建Quarkus后端。 我基本上可以使用以下实体将这种情况简化为该示例:

@Data
@Entity
public class Parent {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OnetoMany(cascade = CascadeType.ALL,orphanRemoval = true)
  @JoinColumn(name = "parentId")
  private List<Child> children;
}

@Data
@Entity
public class Child {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "petId")
  private Pet pet;
}

@Data
@Entity
public class Pet {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

}

实际上,问题要复杂得多,但这可以解释我的想法是问题的根源。 问题是菱形关系。假设一位父母有两个孩子,而且他们都有相同的宠物。 当我现在将父级作为json传递时,

{
  "id": 2,"name": "Parent","childList": [
    {
      "id": 3,"name": "Child1","pet": {
        "id": 3,"name": "Pet"
      }
    },{
      "id": 4,"name": "Child2","name": "Pet"
      }
    }
  ]
}

Jackson无法识别这两个宠物是同一个对象,equals提供的@Data函数也应该这样说-我已经手工覆盖了它,只是检查了名称和即使如此,它也不适用。 当我尝试合并父实体时,这似乎会导致问题,因为它会引发IllegalStateException: Multiple representations of the same entity异常。 我知道如果我重新构建数据结构可能会解决此问题,但是由于它是第三方,所以我没有选择。

有没有办法告诉杰克逊在反序列化时识别相等的对象?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...