StackOverflow在双向对象上使用Hibernate和Jackson时出现异常

Lea*_*ner 3 java spring hibernate jackson

我正在尝试一些休眠.以下是我正在使用的pojo,

@Entity
@Table(name = "person")
public class Person {

    @Id
    @GeneratedValue
    @Column(name = "person_id")
    private long person_id;


    @Column(name = "name")
    private String name;


    @Column(name = "Address")
    private String Address;


    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person" )
    private Set<Phone> phone;

        //Getters ande Setters

}


@Entity
@Table(name = "phone")
public class Phone{

    @Id
    @GeneratedValue
    @Column(name = "phone_id")
    private long phone_id;


    @Column(name = "name")
    private String name;

         @ManyToOne(cascade = CascadeType.MERGE,fetch = FetchType.EAGER)
    @JoinColumn(name = "person_id")
    private Person person ;

        //Getters ande Setters


}
Run Code Online (Sandbox Code Playgroud)

我想要的是当我从人那里获取记录并需要相应的所有手机细节时.(就像选择*来自人)我有大约1360个人的数据,几乎是手机的两倍.但由于某种原因,错误被抛出.我无法看到完整的错误堆栈.以下是我得到的错误.

at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)~ [jackson-databind-2.4.6.jar:2.4.6] at com.fasterxml.jackson.databind.ser.std. BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)〜[jackson-databind-2.4.6.jar:2.4.6] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)~ [jackson -databind-2.4.6.jar:2.4.6] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)~ [jackson-databind-2.4.6.jar:2.4.6]在com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)〜[jackson-databind-2.4.6.jar:2.4.6]的com.fasterxml.jackson.databind.ser. BeanSerializer.serialize(BeanSerializer.java:152)〜[jackson-databind-2.4.6.jar:2.4.6] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:117)~ [jackson-databind-2.4.6.jar:2.4.6]在com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23)〜[jackson-databind-2.4.6.jar:2.4.6] .....

我无法发布我得到的所有错误

Yus*_* K. 8

使用JsonManagedReferenceJsonBackReference注释可以解决您的问题.

当jackson尝试将对象转换为json时,访问对象及其属性.因此,如果对象具有双向关系,对于jackson,我们需要考虑循环依赖性.杰克逊开始序列化人并看到电话列表并从列表中取出电话并开始序列化电话并看到电话中的人并从电话中取出人并开始将其设置为bla bla bla所以这是一个无限循环.如果杰克逊看到这些注释,停止并打破循环.

尝试下面的代码;

@Entity
@Table(name = "person")
public class Person {

    @Id
    @GeneratedValue
    @Column(name = "person_id")
    private long person_id;    

    @Column(name = "name")
    private String name;

    @Column(name = "Address")
    private String Address;
    @JsonManagedReference
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person" )
    private Set<Phone> phone;

    // Getters and Setters

}

@Entity
@Table(name = "phone")
public class Phone{

    @Id
    @GeneratedValue
    @Column(name = "phone_id")
    private long phone_id;

    @Column(name = "name")
    private String name;

    @ManyToOne(cascade = CascadeType.MERGE,fetch = FetchType.EAGER)
    @JoinColumn(name = "person_id")
    @JsonBackReference
    private Person person;

    // Getters and Setters

}
Run Code Online (Sandbox Code Playgroud)