当前位置: 首页 > 知识库问答 >
问题:

在实体类中添加toString方法的java.lang.StackOverflow错误

姬飞昂
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 + "]";
    }   

}

共有3个答案

池赞
2023-03-14

实体类教师有toString()问题:

@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
            + "]";
}

}
丌官博文
2023-03-14

必须从toString()方法中排除冗余参数

  • 在Java中,使用Lombok和@ToString。排除
  • 在Kotlin中使用带有@ExcludeToString

GL

蓬森
2023-03-14

根据堆栈跟踪,您的问题与Student.toString()相关联,因此发生了以下情况:

在<代码>老师。toString(),您正在隐式调用学生。toString()方法是将students成员放在String连接语句中:students。在学生中。toString()代码执行类似操作,将teacher成员包含在String连接语句中。

这意味着调用教师。toString()学生。toString()将导致一个永无止境的循环,其中:Teacher。toString()隐式调用Student。toString(),它反过来隐式调用教师。toString(),它依次调用Student。toString(),它依次调用。。。

2。toString()实现在一个永无止境的循环中不断地来回调用,这最终会溢出堆栈并导致java。lang.StackOverflower错误

要纠正这个问题,您应该删除对实体的. toString()方法的隐式引用。作为替换,您可以有Teacher.toString()简单地输出长度()学生集合,并可能包括一个列表的学生名称。在Student.toString()中,只需包含Teacher.name成员。

 类似资料:
  • 问题内容: 一切正常,直到我添加了实体类。 之后,我开始在运行时收到以下错误: 编辑:添加的学生实体代码 问题答案: 根据学生班级的增加进行了更新 根据堆栈跟踪,您的问题与关联,因此发生了什么: 在中,您通过将成员放在串联语句中隐式调用。通过在串联语句中包含成员,代码内的功能类似。 这意味着调用或将最终导致永无止境的循环,其中:隐式调用,后者又隐式调用,后者又调用,后者又调用… 这2个实现以不断循

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

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

  • 若要添加一个新的实体,点击工具栏的 按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的实体,简单地从模型选项卡拖放实体到画布。 在画布中实体对象的弹出式菜单选项包括: 选项 描述 添加关联的对象 添加全部关联的实体到选择的实体。 剪切 从图表移除实体并放它在剪贴板。 复制 从图表复制实体到剪贴板。 粘贴 将剪贴板的内容贴到图表。 选择全部实体 在图表中选择全部实体。 删除 从图表

  • 若要添加一个新的实体,点击工具栏的 按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的实体,简单地从模型选项卡拖放实体到画布。 如果图表符号设置为默认, 图标代表属性为一个主键。而 图标则代表属性为一个索引。 【注意】如果你右击属性,你可以选择添加、插入、删除、重命名属性及设置属性为主键。 在画布中实体对象的弹出式菜单选项包括: 选项 描述 设计实体 在实体设计器中编辑实体结构,

  • 若要添加一个新的实体,点击工具栏的 按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的实体,简单地从模型选项卡拖放实体到画布。 在画布中实体对象的弹出式菜单选项包括: 选项 描述 添加关联的对象 添加全部关联的实体到选择的实体。 剪切 从图表移除实体并放它在剪贴板。 复制 从图表复制实体到剪贴板。 粘贴 将剪贴板的内容贴到图表。 选择全部实体 在图表中选择全部实体。 删除 从图表