2011-12-19 9 views
2

OK、JPA/Hibernateに関する私の理解に欠けていると思います。私は2つのテーブルを持っています:生徒を表す生徒と、生徒のクラスへの割り当てを表すCC。 CCテーブルには学生を参照するSTUDENTID列があります。私は、関連する生徒記録を持つCCレコードを返す簡単なクエリを実行しようとしています。私のCCクラスは、この(削除されたものがたくさん)のようになります。私は「ID」STUDENTSテーブルの主キーではないのでreferencedColumnNameとを指定する必要が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; 
    ... 
} 

。私は次のようにクエリを実行しようとしています:

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=? 

上記のように、問題は、STUDENTID列がヌルでなくても、CCの「学生」サブオブジェクトが常にヌルであることです。私は何か間違っていると確信していますが、何ですか?

+0

あなたは生徒のリストを繰り返し作成してCCを取得するのに適していませんか? – elias

+0

私は、与えられた学生がいるすべてのクラスを探していたら、はい。しかし、私は反対の情報を探しています:私は特定のクラスのすべてのCCレコードが欲しい、私は同時に学生の情報が必要です。 – fool4jesus

+0

なぜあなたはstudentid列私立学生学生が必要です; カラムは、dbを学生に参照する外部キーとしてすでに格納されています。 – ayengin

答えて

0

私は、Hibernateがあなたの争点はなるかもしれない右ここに、しかし、この行をフェッチしない方法について誤解されることがあります。あなたはLAZYフェッチを使用するようにHibernateを言っているので

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

、それが戻って引っ張っていません参照されたClassオブジェクトのオブジェクトStudentを保持しました。これはクエリの読み込み時間に役立ち、Hibernateは遅延ロードをオンにしてオブジェクトのサブクラスの継承を最適化します。フェッチタイプをEAGERに変更すると、期待している結果が表示されると思います。

関連する問題