当前位置: 首页 > 面试题库 >

JPA:关于在实体类中添加toString方法的java.lang.StackOverflowError

缪升
2023-03-14
问题内容

一切正常,直到我添加toSting()了实体类。

之后,我开始在运行时收到以下错误:

Exception in thread "main" java.lang.StackOverflowError
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.<init>(Unknown Source)
    at entity.Guide.toString(Guide.java:51)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at entity.Student.toString(Student.java:45)
        ...
@Entity
public class Teacher {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    @OneToMany(mappedBy="teacher", cascade={CascadeType.PERSIST})
    private Set<Student> students = new HashSet<Student>();

    public Teacher() {}
    public Teacher(String name) {
        this.name = name;
    }

    public Set<Student> getStudents() {
        return students;
    }       
    public void addStudent(Student student) {
        students.add(student);
        student.setTeacher(this);
    }
    @Override
    public String toString() {
        return "Teacher[id=" + id + ", name=" + name
                + ", students=" + students + "]";
    }

}
public class SnafuClient {
    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("snafu");
        EntityManager em = emf.createEntityManager();
        EntityTransaction txn = em.getTransaction();

                try {
                    txn.begin();

                    Query query = em.createQuery("select teacher from Teacher teacher");
                    List<Teacher> teachers = query.getResultList();

                    for (Teacher teacher: teachers) {
                System.out.println(teacher);
            }


                    txn.commit();
                }   catch(Exception e) {
                    if(txn != null) { txn.rollback(); }
                    e.printStackTrace();
             }  finally {
                    if(em != null) { em.close(); }
                }

    }
}

编辑:添加的学生实体代码

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})
    @JoinColumn(name="teacher_id")
    private Teacher teacher;

    public Student() {}
    public Student(String name, Teacher teacher) {
        this.name = name;
        this.teacher = teacher;
    }

    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + 
                + ", name=" + name + ", teacher=" + teacher + "]";
    }

}

问题答案:

根据学生班级的增加进行了更新

根据堆栈跟踪,您的问题与关联Student.toString(),因此发生了什么:

在中Teacher.toString(),您Student.toString()通过将students成员放在String串联语句中隐式调用+ students +Student.toString()通过teacherString串联语句中包含成员,代码内的功能类似。

这意味着调用Teacher.toString()Student.toString()将最终导致永无止境的循环,其中:Teacher.toString()隐式调用Student.toString(),后者又隐式调用Teacher.toString(),后者又调用Student.toString(),后者又调用…

这2个.toString()实现以不断循环的方式来回调用,来回调用,来回调用,这最终使堆栈溢出并导致java.lang.StackOverflowError

若要更正此问题,应删除.toString()对实体方法的隐式引用。作为替代,你可以有Teacher.toString()简单输出length()的的students收集和可能包括的名单Student姓名(或名称)。并在中Student.toString(),仅包括Teacher.name成员。



 类似资料:
  • 在我在实体类中添加了之前,一切都很顺利。 之后,我开始在运行时得到以下错误: 编辑:添加了学生实体的代码

  • 我一直试图将一个实体添加到数据库中,该实体与另一个实体有OneTo许多关系,但当我插入该实体时,它说无法插入id,因为它是null。 我已经映射了这样的父子类: 子实体: 我的json长这样: 这是hibernate抛出的错误: 错误Msg=ORA-01400:无法将NULL插入(“DQISAPPS”。“目录\备注”。“目录\ ID”) 在甲骨文。jdbc。驾驶员t4cttiore11。proce

  • 问题内容: 我正在尝试使用Java从XSD文件中以编程方式生成JAXB类。我使用以下代码片段实现了这一目的: 生成的类仅包含字段的方法。但是,我想包括,和方法为好。生成代码时该怎么做? 问题答案: 在GitHub网站上,您将找到JAXB2 Basics项目 ,该项目提供了一组通用的实用程序插件,其中包括4个应解决您要实现的目标的插件: 等于插件 HashCode插件 二传手插件 ToString插

  • 我可能需要一些帮助,因为我被这些文件弄糊涂了: 我有一个JPA母公司: 和孩子: 如果我只是增加联系人,我希望JPA能够建立这种关系。 e、 g: 现在发生的是: 触点插入DB(良好) 使用providerX。联系人中的id。提供者列(良好) provider\u contact表中未显示任何关系条目 我知道我可以将联系人设置为提供者的属性<代码>providerX。联系人。添加(c)。。。回购。

  • 本文向大家介绍java中的tostring方法的具体用法,包括了java中的tostring方法的具体用法的使用技巧和注意事项,需要的朋友参考一下 我们知道调用对象的toString()方法会直接输出对象的属性信息,但是具体怎么实现的?以及如何更好地实现它呢?现在来学习下。 通过java文档我们能知道,toString()方法在Object类里定义的,其返回值类型为String类型,返回类名和它的

  • 我在android中添加了第三方字体。我把字体放在资产/字体/qqqq.ttf的根目录中 但它有这样一个错误:无法生成本机字体。 有什么问题?有人知道吗?非常感谢!