我正在尝试使用父/子引用来序列化对象图,实际上我有一个看起来像这样的实体:
@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
对象回来。
答案 0 :(得分:4)
您使用两种相互冲突的方法来管理循环关系。您可以使用JSOGGenerator OR @JsonManagedReference和@JsonBackReference注释。
JSOGGenerator将以JSON序列化格式包含@id和@ref属性,这对于使用其他语言(如JavaScript)反序列化对象非常有用。
@JsonManagedReference和@JsonBackReference使用Java类信息来标识循环引用,随后该信息被排除在JSON序列化格式之外,因此JavaScript之类的另一种语言无法反序列化该对象,因为缺少所需的信息。
JSOGGenerator的另一个好处是它可以处理深层嵌套的循环关系,而不是有限的父子关系。