如何JSON一个休眠树节点

时间:2014-04-04 08:10:00

标签: json spring

@Entity
public class Group{

@Id
@GeneratedValue
private Long id;

@ManyToOne
private Group parent;

@LazyCollection(value=LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "parent")
@Cascade(value = {CascadeType.ALL})
private Set<Group> children = new HashSet<Group>();

}

我如何构建JSON? Json进行无限递归..我正在使用杰克逊。 我需要在我的json输出中有父ID。

2 个答案:

答案 0 :(得分:1)

@JsonBackReference媒体资源上设置@ManyToOne,在@JsonManagedReference媒体资源上设置@OneToMany

@Entity
public class Group{

@Id
@GeneratedValue
private Long id;

@JsonBackReference
@ManyToOne
private Group parent;

@JsonManagedReference
@LazyCollection(value=LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "parent")
@Cascade(value = {CascadeType.ALL})
private Set<Group> children = new HashSet<Group>();

}

答案 1 :(得分:0)

如果Competency实体指向一个Group,那么您可能确实会进入无限递归。您可以在父实例变量和子实例变量上放置@JsonIgnore注释以忽略它们包含在JSON中,或者您可以使用@JsonBackReference / @JsonManagedReference的组合作为另一个海报建议。

您可以做的其他事情是创建一个pojo,其中包含您在服务层中感兴趣的所有属性,从而将hibernate连接从图片中删除。这样的事情:

public class GroupDto {
    private Long id;
    private CompetencyDto parent;
    private List<CompetencyDto> children;
}


public class CompetencyDto {
    private Long id;
}

这虽然看似过度工作,但会让您的演示模型不依赖于您的域模型。在构建视图时,这将为您提供更大的灵活性:

http://codebetter.com/jpboodhoo/2007/09/27/screen-bound-dto-s/

http://martinfowler.com/eaaDev/PresentationModel.html