JPA: java.lang.StackOverflowError auf hinzufügen toString-Methode in der entity-Klassen
Alles funktionierte gut, bis ich Hinzugefügt toSting()
in meiner entity-Klassen.
Nach dem ich start immer folgende Fehlermeldung in der runtime:
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(); }
}
}
}
EDIT: Code für Schüler-Entität Hinzugefügt
@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 + "]";
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktualisiert auf der Grundlage der addition der Schüler-Klasse
Gemäß der stack-trace, dein problem ist im Zusammenhang mit der
Student.toString()
, damit hier was passiert ist:In
Teacher.toString()
Sie implizit den Aufruf derStudent.toString()
indem Sie diestudents
Mitglied innerhalb einerString
Verkettung Aussage:+ students +
. InnerhalbStudent.toString()
der code macht etwas ähnliches, indem Sie dieteacher
Mitglied innerhalb einerString
Verkettung Anweisung.Dies bedeutet, dass Sie entweder
Teacher.toString()
oderStudent.toString()
wird am Ende verursacht eine nie endende Schleife wo:Teacher.toString()
implizit fordertStudent.toString()
, die wiederum implizit fordertTeacher.toString()
, die wiederum ruftStudent.toString()
, die wiederum ruft...Den 2
.toString()
Implementierungen halten, ruft hin und her, hin und her, hin und her, in einer nie endenden Schleife, die schließlich überläuft den Stapel und die Ergebnisse in einemjava.lang.StackOverflowError
.Um das problem zu beheben, entfernen Sie die implizite Verweise auf die
.toString()
Methoden der Entitäten. Als Ersatz, Sie hätteTeacher.toString()
einfach die Ausgabe derlength()
desstudents
Sammlung und vielleicht eine Liste derStudent
name(s). Und in derStudent.toString()
einfach denTeacher.name
Mitglied.Student
Einheit an der Unterseite.toString
Methode in derGuide
Person an diesempublic String toString() { return "Guide [id=" + id + ", staffId=" + staffId + ", name=" + name + ", salary=" + salary + ", students.size()=" + students.size() + "]"; }
. Es löste das Problem. Danke.Student
Klasse. Meine ursprüngliche Vermutung war korrekt und meine Antwort sollte dir helfen das problem behoben.Entity-Klasse Lehrer haben
toString()
problem: