0

我正在尝试使用父/子引用序列化对象图,本质上我有一个如下所示的实体:

@Entity (name = "Container")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Container {
    public String type = "parent";

    @JsonManagedReference ("child")
    @OneToMany (mappedBy = "parent", cascade = CascadeType.PERSIST)
    public List<Child> children;
}

@Entity (name = "Child")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Child {
    public String type = "child";

    @JsonBackReference ("child")
    @ManyToOne
    public Parent parent;
}

当我尝试将其序列化给客户端时,这就是我得到的:

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
        },
        { ... }
    ]
}

我看到@id所有对象的属性,但看不到任何@ref属性。如果我对 jsog 和 jsog-jackson 的理解正确,那么实际上应该序列化:

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
            @ref: 1
        },
        { ... }
    ]
}

我真正想要的是一种在浏览器中恢复序列化 JSOG 之后恢复对父级的原始反向引用的方法,这样@ref我就可以取回parent每个child对象中的属性。

4

1 回答 1

4

您使用两种相互冲突的方法来管理循环关系。您可以使用 JSOGGenerator@JsonManagedReference 和 @JsonBackReference 注释。

JSOGGenerator 将包含 JSON 序列化格式的 @id 和 @ref 属性,这对于用另一种语言(例如 JavaScript)反序列化对象很有用。

@JsonManagedReference 和 @JsonBackReference 使用 Java 类信息来识别循环引用,随后该信息从 JSON 序列化格式中排除,因此 JavaScript 等其他语言无法反序列化对象,因为缺少所需的信息。

JSOGGenerator 的另一个好处是它可以处理深度嵌套的循环关系,而不是有限的父子关系。

于 2016-12-01T15:27:06.910 回答