[当我尝试执行以下代码时,我得到了StackOverflow异常
@Test
public void testMappings() {
EntityManager em = factory.createEntityManager();
Query q = em.createQuery("select f from Student f");
System.out.println(q.getResultList());
em.close();
}
我有三个实体(Student,Course,CourseRegistration),如下所示
@Entity
@Table(name = "student")
@Data
@EqualsAndHashCode
public class Student {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@ManyToMany
@JoinTable(name = "course_registration", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id"))
private Set<Course> likedCourses;
@OneToMany(mappedBy = "student")
private Set<CourseRegistration> registrations;
public Student() {
}
}
Course.java
@Entity
@Table(name = "course")
@Data
@EqualsAndHashCode
public class Course {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@ManyToMany(mappedBy = "likedCourses")
private Set<Student> likes;
@OneToMany(mappedBy = "course")
private Set<CourseRegistration> registrations;
public Course() {
}
}
CourseRegistration.java
@Entity
@Table(name = "course_registration")
@Data
@EqualsAndHashCode
public class CourseRegistration {
@Id
@Column(name = "id")
private Long id;
@ManyToOne
@MapsId("student_id")
@JoinColumn(name = "student_id")
private Student student;
@ManyToOne
@MapsId("course_id")
@JoinColumn(name = "course_id")
private Course course;
@Column(name = "rating")
private int rating;
public CourseRegistration() {
}
}
例外情况如下
java.lang.StackOverflowError
at org.jboss.logging.Log4jLogger.doLog(Log4jLogger.java:40)
at org.jboss.logging.Logger.debug(Logger.java:385)
at org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement(SqlStatementLogger.java:109)
at org.hibernate.engine.jdbc.spi.SqlStatementLogger.logStatement(SqlStatementLogger.java:94)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:181)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.prepareQueryStatement(AbstractLoadPlanBasedLoader.java:257)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:201)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:137)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102)
at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:100)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:693)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:92)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1933)
at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:558)
谁能告诉我我哪里出了问题
我建立了您的代码,发现此问题是由于lombok生成的hashCode()/equeals()
和toString()
方法引起的>>
(在数据库中添加了等级字段,结果是:at model.Student.hashCode(Student.java:13) at java.util.HashMap.hash(HashMap.java:339) at java.util.HashMap.put(HashMap.java:612) at java.util.HashSet.add(HashSet.java:220) at java.util.AbstractCollection.addAll(AbstractCollection.java:344) ... ... ... at model.Course.hashCode(Course.java:13) at java.util.HashMap.hash(HashMap.java:339) at java.util.HashMap.put(HashMap.java:612) at java.util.HashSet.add(HashSet.java:220)
我已经删除了所有的龙目岛注释
[Student{id=123, name='Manu', likedCourses=[Course{id=224, name='Course2'}, Course{id=223, name='Course1'}], registrations=[CourseRegistration{id=1, rating=1}, CourseRegistration{id=2, rating=1}]}, Student{id=124, name='Susan', likedCourses=[Course{id=223, name='Course1'}], registrations=[CourseRegistration{id=3, rating=1}]}, Student{id=125, name='Jacob', likedCourses=[Course{id=224, name='Course2'}, Course{id=223, name='Course1'}], registrations=[CourseRegistration{id=4, rating=1}, CourseRegistration{id=5, rating=1}]}, Student{id=126, name='Mathew', likedCourses=[Course{id=224, name='Course2'}, Course{id=223, name='Course1'}, Course{id=226, name='Course4'}], registrations=[CourseRegistration{id=6, rating=1}, CourseRegistration{id=8, rating=1}, CourseRegistration{id=7, rating=1}]}, Student{id=127, name='Sunny', likedCourses=[], registrations=[]}]
您是否研究过实体的已编译类?我的意思是lombok为您生成的那些equals()