1. 问题描述:
在使用hibernate进行对数据库的查询操作的时候,数据已经成功从数据库查出来了,但是还在循环遍历输出的时候报错:java.lang.StackOverflowError
2. 解决过程:
2.1 这是我的查询方法:
@Test
public void test01() {
Session session = SessionFactoryUtil.getSessionFactory().openSession();
String hql = "from Student";
Query query = session.createQuery(hql);
List list = query.list();
list.forEach(System.out::println);
}
2.2 这是报错信息:
java.lang.StackOverflowError
at java.lang.Integer.toString(Integer.java:402)
at java.lang.Integer.toString(Integer.java:935)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at Course.toString(Course.java:16)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:622)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at Student.toString(Student.java:25)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:622)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at Course.toString(Course.java:16)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:622)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at Student.toString(Student.java:25)
......无限循环
2.3 查看报错信息,发现最上方的异常指向了我的lombok注解:@Data
2.4 怀疑是hibernate不支持lombok
于是将注解全部换为了setter、getter和toString方法
然后又报同样的错,这次指向了我的Student类的toString方法中输出courseList的这行
2.5 看一下我的两个实体类:
Student 类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@ManagedBean(name = "student")
@Entity(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany
private List<Course> courseList;
}
Course 类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "course")
@ManagedBean(name = "course")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer no;
@ManyToMany(mappedBy = "courseList")
private List<Student> studentList;
}
说明:Student 和Course两个类为多对多关系,所以每个类中都一个对方的集合
2.6 找到问题:
看到这里不难发现,在Student类里有Course的一个集合courseList
,而在Course类里,也有Student的一个集合studentList
,所以在输出的时候,进入了一个无线循环的过程,简单描述为:
student -> course -> student->course...
3. 解决方法:
将Course
类中的toString()
方法中输出studentList
这一行删除,只保留在Student
类中输出courseList
的这行即可。或者只保留Course
类里的输出studentList
的即可