2011-12-19 28 views
2

好的,我認爲在理解JPA/Hibernate時有一些缺失。我有兩張表格:代表學生的學生,代表學生分班的CC。 CC表格有一個指向學生的STUDENTID列。我正在嘗試做一個簡單的查詢,在其中返回CC記錄及其關聯的學生記錄。我的CC類看起來像這樣(很多東西刪除):JPA/Hibernate查詢但沒有分配子對象

@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」是不是學生表的主鍵。我想查詢如下:

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是做正確的查詢,連接表一起,甚至返回學生表列在查詢投影:

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的「學生」子對象始終爲空,即使STUDENTID列不爲null並且是正確的。我確定我做錯了什麼,但是什麼?

+0

會不會更好地迭代學生名單並獲得他們的CC? – elias 2011-12-19 15:10:55

+0

如果我正在尋找給定學生所在的所有課程,那麼是的。但是我正在尋找相反的信息:我需要給定班級的所有CC記錄,並且同時需要學生的信息。 – fool4jesus 2011-12-19 15:23:42

+0

爲什麼你需要studentid專欄學生學生; 列已經存儲在數據庫中作爲引用學生的外鍵。 – ayengin 2012-01-11 20:19:43

回答

0

我可能是弄錯了的方式Hibernate沒有取,但是,這條線在這裏可以證明你的癥結:

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

既然你告訴Hibernate來使用LAZY抓取,它不會拉回持續Student對象爲Class對象引用。這有助於查詢加載時間,Hibernate通過打開延遲加載來優化對象的子類繼承。如果您將獲取類型更改爲EAGER,我想您會看到您期待的結果。