Hibernate 和 Playframework 1.2.4:查询成员集合大小时的奇怪行为

Hibernate and Playframework 1.2.4 : strange behaviour when querying member collection size

我有三个类。

Class 入学考试:

@Entity
public class EntranceExam extends GenericModel implements Comparable<EntranceExam> {
    @OneToMany(cascade = CascadeType.REMOVE, mappedBy = "entranceExam")
    public List<Examination> examinations;
}

Class考试:

@Entity
public class Examination extends Model implements Comparable<Examination> {
    @ManyToOne(optional = false)
    public EntranceExam entranceExam;

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "examination")
    public Question mainQuestion;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "examination", fetch = FetchType.LAZY)
    public Set<Question> questions = new HashSet<Question>();
}

Class 问题:

@Entity
public class Question extends GenericModel implements Serializable,
        Comparable<Question> {
    @ManyToOne
    public Examination examination;

    @Sort(type = SortType.NATURAL)
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parentQuestion", cascade = { CascadeType.ALL })
    public Set<Question> childQuestions;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "PARENT_ID", nullable = true)
    public Question parentQuestion;

}

所以,当我一起使用它们时:

EntranceExam entranceExam = EntranceExam.findById(id);
System.out.println(entranceExam.examinations.size());

它returns是入学考试的试题数而不是考试次数。 如果我简化,MySQL 日志中的匹配查询如下所示:

select examinations0_.entranceExam_id as entranceExam4_108_3_,
     examinations0_.id as id3_
from Examination examinations0_
     left outer join Question question1_
     on examinations0_.id=question1_.examination_id
     left outer join Question question2_
     on question1_.PARENT_ID=question2_.questionId
where epreuves0_.entranceExam_id=4;

我的 Java 代码哪里出了问题?

您可能需要将 entranceExam.examinations 包装成 HashSet,默认情况下,hibernate 会为每个子对象创建一个父对象。

Set examinations = new HashSet(entranceExam.examinations)

另一种方法是设置不同的策略 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);