好吧,我认为我对JPA / Hibernate的理解有些缺失。我有两个表:代表学生的学生,以及代表学生对课程作业的CC。 CC表有一个STUDENTID列,指向学生。我正在尝试做一个简单的查询,其中我返回CC记录及其相关的学生记录。我的CC类看起来像这样(删除了很多东西):
@Entity
@Table(name="cc")
public class CC {
...
@Column(name="studentid", nullable=false, updatable=false)
private Integer studentid;
@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumns({ @JoinColumn(name="studentid", referencedColumnName="id",
insertable=false, updatable=false) })
private Student student;
...
}
我必须指定referencedColumnName,因为“ID”不是STUDENTS表的主键。我试图查询如下:
EntityManager em = getCurrentEntityManager();
Query query = em.createQuery ( "select cc from CC cc inner join fetch cc.student where cc.sectionid=:sectionid");
query.setParameter("sectionid", sectionId);
List<CC> rows = query.getResultList();
if (!CollectionUtils.isEmpty(rows)) for (CC cc: rows) {
Student student = cc.getStudent();
//// PROBLEM: student object is null here (though studentid is correct)!
}
我可以看到hibernate正确地进行查询,将表连接在一起,甚至在查询投影中返回student表的列:
select cc0_.dcid as dcid21_0_, student1_.DCID as DCID7_1_, cc0_.course_number as course2_21_0_,
... student1_.FIRST_NAME as FIRST28_7_1_, student1_.GENDER as GENDER7_1_, ...
from cc cc0_ inner join STUDENTS student1_
on cc0_.studentid=student1_.ID where cc0_.sectionid=?
如上所述,问题是CC的“student”子对象始终为null,即使STUDENTID列不为空并且是正确的。我确定我做错了什么,但是什么?
答案 0 :(得分:0)
我可能会误解hibernate的提取方式,但是,这一行可能会证明你的关键点:
@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
由于您告诉Hibernate使用LAZY
抓取,因此不会撤回引用的Student
对象的持久Class
个对象。这有助于查询加载时间,Hibernate优化了对象子类继承,并启用了延迟加载。如果您将获取类型更改为EAGER
,我认为您会看到您期望的结果。