【问题标题】:Hibernate gets objcets over and over in a endless loopHibernate 在无限循环中一遍又一遍地获取对象
【发布时间】:2021-02-15 05:44:27
【问题描述】:

我想我在 Hibernate 以及我编写实体的方式上做错了,因为当我尝试获取一个包含另一个对象的对象时,他们开始一遍又一遍地互相获取。此外,当调用应该返回字符串中所有字段的 toString 方法时,我遇到了 stackoverflow 错误。

Instructor 只能有一个InstructorDetail 和各种Course,它或多或少地按预期工作,但有些问题。

导师班

@Entity
@Table(name="instructor_table")
public class Instructor {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="instructor_id")
    private int instructorId;
    
    @Column(name="instructor_name")
    private String instructorName;
    
    @OneToOne(mappedBy="instructor", cascade = CascadeType.PERSIST)
    private InstructorDetail instructorDetail;
    
    @OneToMany(mappedBy="instructor", cascade = CascadeType.PERSIST)
    private List<Course> courses;

InstructorDetail类

@Entity
@Table(name="instructor_detail_table")
public class InstructorDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="instructor_detail_id")
    private int instructorDetailId;
    
    @Column(name="instructor_class")
    private String instructorDetailClass;
    
    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="instructor_id")
    private Instructor instructor;
    

课程班

@Entity
@Table(name="course_table")
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="course_id")
    private int courseId;
    
    @Column(name="course_class")
    private String course_class;
    
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="instructor_id")
    private Instructor instructor;

【问题讨论】:

  • 这可能是由于您的模型Instructor 指的是InstructorDetail,而后者又指的是Instructor。作为解决方案,您可以在InstructorDetail 中使用instructor_id
  • 添加代码示例

标签: java database hibernate jpa spring-data-jpa


【解决方案1】:

您已经在两个方向上定义了关系,因此尝试递归评估每个属性将始终是一个无限循环。

instructor -> instructorDetail -> instructor -> instructorDetail -> ...

您需要从您的 toStringequalshashCode 实现中排除其中一个方向,或者以其他方式更改它们以中断链。采用哪种方式取决于您,以及您对对象相等性的定义。

或者,只是不要在两个方向上定义它们。

【讨论】:

  • 修复了 Instructor - InstructorDetail 关系。我想我不明白如何使用 mappedBy 或应该在什么时候使用它。
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多