当来自不同实体类型的 ID 重叠时,是不是可以将 @JsonIdentityInfo 与 ObjectIdGenerators.PropertyGenerator 一起使用?

Posted

技术标签:

【中文标题】当来自不同实体类型的 ID 重叠时,是不是可以将 @JsonIdentityInfo 与 ObjectIdGenerators.PropertyGenerator 一起使用?【英文标题】:Is it possible to user @JsonIdentityInfo with ObjectIdGenerators.PropertyGenerator when the IDs from different entity types overlap?当来自不同实体类型的 ID 重叠时,是否可以将 @JsonIdentityInfo 与 ObjectIdGenerators.PropertyGenerator 一起使用? 【发布时间】:2014-02-28 07:23:12 【问题描述】:

当来自不同实体类型的 ID 重叠时,是否可以将 @JsonIdentityInfo 与 ObjectIdGenerators.PropertyGenerator 一起使用?

假设我有以下 XML 并想用 Jackson 2.x 反序列化它:

<foo>
  <id>3</id>
  <name>Peter</name>
  <bar>
     <id>3</id>
     <kind>dog</kind>
     <!--belongsTo>3</belongsTo-->
  </bar>
</foo>

我已经用 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 注释了 Foo 和 Bar 类。

反序列化失败并显示com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.lang.String) [3]

如果 bar 的 id 为 4,则一切正常。

Jackson 对 XML 中的 ID 进行反序列化有什么要求?我假设 - 因为杰克逊知道哪个实体范围,只要它属于不同的类型,它就可以使用相同的 id。

P.S.:是否设置了 belongsTo 引用(指向 foo 对象)似乎并不重要。

【问题讨论】:

【参考方案1】:

您可能已经找到了答案,但万一您还没有……

您应该能够为此使用@JsonIdentityInfo 的scope 参数,即,

@JsonIdentityInfo(scope=Foo.class, property="id", generator=ObjectIdGenerators.PropertyGenerator.class)
public class Foo  ... 

@JsonIdentityInfo(scope=Bar.class, property="id", generator=ObjectIdGenerators.PropertyGenerator.class)
public class Bar  ... 

【讨论】:

它适用于 JSON 对象。 XML 对象呢?

以上是关于当来自不同实体类型的 ID 重叠时,是不是可以将 @JsonIdentityInfo 与 ObjectIdGenerators.PropertyGenerator 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

盒装与原始类型作为实体 id

检测视图是不是重叠

对 Type-graphql 和 Typeorm 实体中的外键字段使用 ID 标量类型在语义上是不是正确?

当来自 db 的数据不好时是不是应该抛出异常?

实体类型 ApplicationUser 不是当前上下文模型的一部分。在项目开始时使用了两个不同的数据库

当属性值来自引用表时,应该如何填充实体(bean)对象属性?