多对多关系中的Hibernate无限循环递归

2024-01-04

我想建立双向的学生与学科关系。在我将用户注册为纪律之前,一切都会正常进行。现在我得到了无限递归。

类看起来像这样:

//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();
    }
}

错误似乎是在加载之后设置的Student s = sDao.findOne(id);

尝试在这里搜索,但未能找到正确的解决方案。任何事情都会产生相同的结果。

错误日志 http://pastebin.com/JZ6Xd68N


org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:430) 〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] 在 truelecter.practproekt.entity。纪律.hashCode(纪律.java:31) 〜[课程/: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。学生.hashCode(Student.java:29) ~[类/: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 and Student实体使用这两个实体。
也许我错了,堆栈跟踪中不是很清楚。
你是如何定义的equals() and hashcode()您的实体的方法?
假设实体A和实体B具有双向关系。
If equals()/hashcode()实体的实施A调用equals()/hashcode()在实体上B本身调用的字段equals()/hashcode()在实体上A领域,你有一个循环。
而你的错误。

此外,即使您通过确保两者中只有一个引用另一个来缩短循环equals()/hashcode()/toString(),你应该调用equals()/hashcode()/toString实体关系的方法要谨慎。
它可能会对性能产生真正的影响。如果打开 Hibernate 会话,它确实可能会执行您不希望执行的查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多对多关系中的Hibernate无限循环递归 的相关文章

随机推荐