使用相同的类可以多次执行Hibernate,无法编写JSON:无限递归

时间:2017-09-04 12:46:21

标签: java json spring hibernate jpa

我有hibernate和JSON的问题,当我对同一个类使用多对多时,我得到递归

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.Set;
import java.util.UUID;

@Entity
public class AssistantGraphVertex {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private UUID uuid;

    @ManyToOne
    private AssistantGraphs assistantGraphs;

    private String name;
    private String description;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "assistant_graph_edge",
            joinColumns = { @JoinColumn(name = "parent_uuid") },
            inverseJoinColumns = { @JoinColumn(name = "child_uuid") }
    )
    private Set<AssistantGraphVertex> parents;

    @ManyToMany(mappedBy = "parents")
    private Set<AssistantGraphVertex> children;

    public UUID getUuid() {
        return uuid;
    }

    public void setUuid(UUID uuid) {
        this.uuid = uuid;
    }

    public AssistantGraphs getAssistantGraphs() {
        return assistantGraphs;
    }

    public void setAssistantGraphs(AssistantGraphs assistantGraphs) {
        this.assistantGraphs = assistantGraphs;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Set<AssistantGraphVertex> getChildren() {
        return children;
    }

    public void setChildren(Set<AssistantGraphVertex> children) {
        this.children = children;
    }

    public Set<AssistantGraphVertex> getParents() {
        return parents;
    }

    public void setParents(Set<AssistantGraphVertex> parents) {
        this.parents = parents;
    }
}

问题看起来像这样:

  

无法写入HTTP消息:org.springframework.http.converter.HttpMessageNotWritableException:无法写入JSON:无限递归(StackOverflowError);

我想收到一个关于其父母和孩子的课程的信息,但对于下一个嵌套课程,我不需要这些信息,如何才能更好地实现这一目标?

1 个答案:

答案 0 :(得分:2)

你可以简单地忽略序列化一方起诉@JsonIgnore

@JsonIgnore
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "assistant_graph_edge",
        joinColumns = { @JoinColumn(name = "parent_uuid") },
        inverseJoinColumns = { @JoinColumn(name = "child_uuid") }
)
private Set<AssistantGraphVertex> parents;

@JsonIgnore
@ManyToMany(mappedBy = "parents")
private Set<AssistantGraphVertex> children;

或者您可以使用@JsonIdentityInfo,它将在第二级序列化中为hibernate创建一个将打破循环的引用

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id")
public class AssistantGraphVertex {

有关详细信息,请查看此link