tru*_*ter 3 java recursion many-to-many hibernate
我想创建双向的学生纪律关系。在我注册用户进行纪律之前,一切正常。现在我得到了无限递归。
类看起来像这样:
//Student.java
@Entity
@Table(name = "students")
public class Student {
@NotNull
@Id
@Column(name = "STUDENT_ID")
private String id;
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "students_disciplines", joinColumns = @JoinColumn(name = "STUDENT_ID"), inverseJoinColumns = @JoinColumn(name = "DISCIPLINE_ID"))
@JsonSerialize(using = NestedDisciplineSetSerializer.class)
private Set<Discipline> disciplines = new HashSet<>();
//Getters, Setters
}
//NestedDisciplineSetSerializer.java
public class NestedDisciplineSetSerializer extends JsonSerializer<Set<Discipline>> {
@Override
public void serialize(Set<Discipline> value, JsonGenerator jgen, SerializerProvider p) throws IOException, JsonProcessingException {
jgen.writeStartArray();
for (Discipline s : value) {
jgen.writeStartObject();
jgen.writeStringField("name", s.getName());
jgen.writeNumberField("id", s.getId());
jgen.writeBooleanField("recommended", s.isRecommended());
jgen.writeEndObject();
}
jgen.writeEndArray();
}
}
//Discipline.java
@Entity`enter code here`
@Table(name = "disciplines")
public class Discipline {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
@Column(name = "DISCIPLINE_ID")
private int id;
@NotNull
private String name;
@NotNull
private int credits;
private String annotation;
private boolean recommended;
@ManyToMany(mappedBy = "disciplines", fetch = FetchType.EAGER)
@JsonSerialize(using = NestedStudentSetSerializer.class)
private Set<Student> students = new HashSet<>();
//Getters, Setters
}
//NestedStudentSetSerializer.java
public class NestedStudentSetSerializer extends JsonSerializer<Set<Student>> {
@Override
public void serialize(Set<Student> value, JsonGenerator jgen, SerializerProvider p) throws IOException, JsonProcessingException {
jgen.writeStartArray();
for (Student s : value) {
jgen.writeStartObject();
jgen.writeStringField("name", s.getName());
jgen.writeStringField("id", s.getId());
jgen.writeEndObject();
}
jgen.writeEndArray();
}
}
Run Code Online (Sandbox Code Playgroud)
错误似乎是在加载 Set 之后 Student s = sDao.findOne(id);
试图在这里搜索,但无法找到正确的解决方案。任何事情都产生了相同的结果。
org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:430) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 在 truelecter.practproekt.entity。纪律.hashCode(Discipline.java:31) ~[classes/:na] 在 java.util.HashMap.hash(HashMap.java:338) ~[na:1.8.0_91] 在 java.util.HashMap.put(HashMap.java: 611) ~[na:1.8.0_91] 在 java.util.HashSet.add(HashSet.java:219) ~[na:1.8.0_91] 在 java.util.AbstractCollection.addAll(AbstractCollection.java:344) ~[ na:1.8.0_91] 在 org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:327) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 在 org.hibernate。 engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:234) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 在 ... org.hibernate.collection.internal.PersistentSet。 hashCode(PersistentSet.java:430) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 在 truelecter.practproekt.entity。Student.hashCode(Student.java:29) ~[classes/:na] 在 java.util.HashMap.hash(HashMap.java:338) ~[na:1.8.0_91] 在 java.util.HashMap.put(HashMap.java: 611) ~[na:1.8.0_91] 在 java.util.HashSet.add(HashSet.java:219) ~[na:1.8.0_91] 在 java.util.AbstractCollection.addAll(AbstractCollection.java:344) ~
我的印象是和实体的hashcode()方法实现Discipline同时Student使用了两个实体。
也许我错了,堆栈跟踪中不是很清楚。
你是如何为实体定义equals()和 hashcode()方法的?
假设实体A和实体B具有双向关系。
如果equals()/hashcode()实施实体A
所调用equals()/hashcode()的实体B领域本身调用equals()/hashcode()的实体A领域,你有一个周期。
而你的错误。
此外,即使您通过确保两者中只有一个引用另一个来缩短循环equals()/hashcode()/toString(),您也应该equals()/hashcode()/toString谨慎地调用实体关系的方法。
它可能会对性能产生真正的影响。如果打开了 Hibernate 会话,它可能确实会执行您不希望执行的查询。
| 归档时间: |
|
| 查看次数: |
4284 次 |
| 最近记录: |