Jackson - 具有双向关系的实体序列化(避免循环)
Posted
技术标签:
【中文标题】Jackson - 具有双向关系的实体序列化(避免循环)【英文标题】:Jackson - serialization of entities with birectional relationships (avoiding cycles) 【发布时间】:2012-04-21 08:11:58 【问题描述】:我有两个实体:
Parent
Child[] children;
and
Child
Parent parent;
我知道@JsonBackReference
和@JsonManagedReference
。
它们很好,如果我要序列化 Parent
的实例。
但我还需要传输Child
的实例,并且我希望填充parent
字段。
换句话说:
-
在序列化
Parent
时,它应该有children
,但它们的父字段可能为空(可以通过使用json 引用注释来解决)。
在序列化Child
时,它应该有parent
和它们的children
(但children
不必填充parent
。
有没有办法使用标准的杰克逊功能来解决这个问题?
即跳过已经序列化的实体的序列化,而不是标记符合或不符合序列化条件的字段。
【问题讨论】:
【参考方案1】:Jackson 2.0 确实支持完整的循环对象引用。有关示例,请参见“Jackson 2.0 released”(“处理任何对象图,甚至是循环对象图!”一节)。
基本上,对于需要 id/idref 样式处理的类型,您需要使用新的 @JsonIdentityInfo
。在您的情况下,这将是 Parent
和 Child
类型(如果一个扩展另一个,只需将其添加到超类型就可以了)。
【讨论】:
相当新鲜的版本。需要一些包裹移动。好的,我去看看。 是的,是的,大升级。但功能本身也很大。 :-) 如何在 javascript 中使用 JSON2 反序列化? 对不起——Jackson 2.0 只是库的版本;结果只是普通的 JSON。但至于如何解析引用,为此您需要一个匹配的 javascript 库:JSON 格式没有任何东西可以显式帮助解析 deps。 我也有类似的问题,但在尝试此解决方案后没有运气:***.com/q/36809325/3300911【参考方案2】:jackson 2 库中提供了非常方便的接口实现
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Parent ....
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Child ....
在 Maven 中
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.0.2</version>
</dependency>
@StaxMan 提供了一个不错的开始链接
【讨论】:
进一步支持阅读wiki.fasterxml.com/JacksonFeatureObjectIdentity 对休眠映射没有帮助 此链接描述了更多细节:github.com/FasterXML/jackson-docs/wiki/Presentation-Jackson-2.0 你摇滚!在互联网上搜索了这个问题。终于找到了解决办法。非常感谢! 这个解决方案对我来说非常适合 Spring Data MongoDB DBRef 双向引用。谢谢!!以上是关于Jackson - 具有双向关系的实体序列化(避免循环)的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:将现有子实体添加到具有 OneToMany 双向关系的新实体并将其持久化(“分离的实体传递给持久化”)