【问题标题】:StackOverflow Exception while using Hibernate and Jackson on bi-directional objects在双向对象上使用 Hibernate 和 Jackson 时出现 StackOverflow 异常
【发布时间】:2016-07-02 07:00:21
【问题描述】:

我正在尝试一些休眠。以下是我正在使用的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


}

我想要的是当我从人那里获取记录并需要相应的所有电话详细信息时。 (如 Select * from person)我个人有大约 1360 条数据,电话中的数据几乎翻了一番。但是由于某种原因会引发错误。我看不到完整的错误堆栈。以下是我遇到的错误。

在 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] 在 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] 在 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] 在 .....

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

【问题讨论】:

  • 这部分错误日志没用。我们需要错误日志的第一部分来提供帮助
  • 在序列化您的对象时似乎发生了stackoverflow异常,人与人之间的关系以及电话与人的关系导致无限循环
  • 是的,即使我也这么认为。但是为什么会发生。我的方法正确吗?
  • 这与休眠无关,它的根源是杰克逊。
  • 那我现在能做什么?

标签: java spring hibernate jackson


【解决方案1】:

使用JsonManagedReferenceJsonBackReference 注释可能会解决您的问题。

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

试试下面的代码;

@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

}

【讨论】:

  • 感谢您的回复。我试过仍然抛出同样的错误
  • 从哪个包 JsonManagedReference 导入?
  • 导入如下包 import org.codehaus.jackson.annotate.JsonManagedReference;
  • 尝试导入为 import com.fasterxml.jackson.annotation.JsonManagedReference;
  • 不客气,当杰克逊试图将对象转换为 json 时,请访问对象及其属性。所以如果对象有双向关系,对于jackson我们需要考虑循环依赖。 Jackson 开始序列化人员并查看电话列表并从列表中取出电话并开始序列化电话并查看电话中的人员并从电话中获取 preson 并开始对其进行序列化 bla bla bla 所以这是一个无限循环。如果杰克逊看到这些注释,停止并打破循环。
【解决方案2】:

您也可以在课程中使用@JsonIdentityInfo

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
@Table(name = "phone")
public class Phone {

}

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
@Table(name = "person")
public class Person {

}

【讨论】:

    【解决方案3】:

    我也遇到了同样的错误。 使用@JsonBackReference 和@JsonManagedReference 仍然给我错误,所以我使用了@JsonIdentityInfo,它就像一个魅力。

    以下是我的课程:-

    图书模型:

    @Data
    @Entity
    @Table(name = "book")
    @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="bookId")
    public class BookModel implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "book_id")
        private int bookId;
        
        
        @Column(name="book_name")
        private String bookName;
        
        @Column(name="book_author")
        private String bookAuthor;
        
        @Column(name="book_publish_date")
        private Date bookPublishDate;
        
        @Column(name="book_price")
        private double bookPrice;
        
        @OneToMany(mappedBy = "book_model")
        List<BookImagesModel>  bookImagesModels;
        //getters and setters
        //default constructor
    

    }

    BookImagesModel:

    @Data
    @Entity
    @Table(name = "book_images")
    @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="imageId")
    public class BookImagesModel implements Serializable {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "image_id")
        private long imageId;
    
        @ManyToOne
        @JoinColumn(name = "book_id")
        private BookModel book_model;
    
        
        @Column(name = "image_path")
        private String imagePath;
    
    //getters and setters
            //default constructor
    
    }
    

    我在spring boot中使用了Mysql8数据库。

    【讨论】:

      猜你喜欢
      • 2018-05-21
      • 2022-07-22
      • 2017-04-16
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      相关资源
      最近更新 更多