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);
我有三个类。
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);