Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate JPA:java.lang.StackOverflower关于在实体类中添加toString方法的错误_Hibernate_Stack Overflow_Jpql_Tostring_Jpa 2.1 - Fatal编程技术网

Hibernate JPA:java.lang.StackOverflower关于在实体类中添加toString方法的错误

Hibernate JPA:java.lang.StackOverflower关于在实体类中添加toString方法的错误,hibernate,stack-overflow,jpql,tostring,jpa-2.1,Hibernate,Stack Overflow,Jpql,Tostring,Jpa 2.1,在我在实体类中添加了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.

在我在实体类中添加了
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)
        ...
根据增加的学生班级进行更新 根据堆栈跟踪,您的问题与
Student.toString()
有关,下面是发生的情况:

Teacher.toString()
中,通过将
Student
成员放置在
String
连接语句中,隐式调用
Student.toString()
。在
Student.toString()
中,代码通过在
String
连接语句中包含
teacher
成员来执行类似的操作

这意味着调用
Teacher.toString()
Student.toString()
将导致一个永无止境的循环,其中:
Teacher.toString()
隐式调用
Student.toString()
,后者又隐式调用
Teacher.toString()
,后者又调用
Student.toString()
,这反过来又叫

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


要更正此问题,应删除对实体的
.toString()
方法的隐式引用。作为替代,您可以让
Teacher.toString()
只需输出
Student
集合的
length()
,并可能包括
Student
姓名列表。在
Student.toString()
中,只需包含
Teacher.name
成员。

实体类教师有
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
            + "]";
}

}
@实体
公共班主任{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
@OneToMany(mappedBy=“teacher”,cascade={CascadeType.PERSIST})
private Set students=new HashSet();
公共教师(){}
公共教师(字符串名称){
this.name=名称;
}
公共集getStudents(){
留学生;
}       
公立学校学生(学生){
学生。添加(学生);
学生。塞塔彻(本);
}
@凌驾
公共字符串toString(){
返回“教师[id=“+id+”,name=“+name
+ "]";
}
}

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

  • 在Java中与
    @ToString.Exclude一起使用
  • 在Kotlin中使用带
    @ExcludeToString的

GL

编辑了文章,在底部添加了
Student
实体的代码。刚刚将
Guide
实体中的
toString
方法更新到此
public String toString(){return“Guide[id=“+id+”,staffId=“+staffId+”,name=“+name+”,salary=“+salary+”,students.size()=“+students.size()+”);}
。它解决了这个问题。谢谢。@skip-我已经根据您添加的
学生
课程更新了我的答案。我最初的猜测是正确的,我的回答应该能帮助你纠正这个问题。
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 + "]";
    }   

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

}