JPA / Hibernate查询但不分配子对象

时间:2011-12-19 15:08:09

标签: java hibernate jpa

好吧,我认为我对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列不为空并且是正确的。我确定我做错了什么,但是什么?

1 个答案:

答案 0 :(得分:0)

我可能会误解hibernate的提取方式,但是,这一行可能会证明你的关键点:

@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})

由于您告诉Hibernate使用LAZY抓取,因此不会撤回引用的Student对象的持久Class个对象。这有助于查询加载时间,Hibernate优化了对象子类继承,并启用了延迟加载。如果您将获取类型更改为EAGER,我认为您会看到您期望的结果。