2011-12-19 2 views
2

OK, JPA/Hibernate에 대한 이해가 부족하다고 생각합니다. 나는 두 개의 테이블을 가지고 있습니다 : 학생을 나타내는 학생과 수업에 학생의 과제를 나타내는 CC. CC 테이블에는 학생을 나타내는 STUDENTID 열이 있습니다. 나는 관련된 학생 기록과 함께 CC 레코드를 반환하는 간단한 쿼리를 시도하고있다. 내 CC 클래스는이 (삭제 물건 많이)처럼 보이는 : 나는 "ID"학생들 테이블의 기본 키가 아니기 때문에 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)! 
} 

내가 쿼리 프로젝션에 학생 테이블의 열을 함께 테이블에 가입하고도 반환, 최대 절전 모드가 제대로 쿼리를하고있다 볼 수 있습니다

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 열이 null이 아니고 올바른 경우에도 CC의 "student"하위 객체가 항상 null이라는 것입니다. 나는 틀린 일을하고 있다고 확신하지만, 뭐라구?

+0

학생 목록을 반복 작성하고 CC를받는 것이 좋지 않습니까? – elias

+0

주어진 학생이 들어있는 모든 수업을 찾고 있다면 예. 그러나 반대 정보를 찾고 있습니다. 특정 클래스에 대한 모든 참조 레코드가 필요하며, 동시에 학생의 정보가 필요합니다. – fool4jesus

+0

왜 학생 교실 비공개 학생 학생이 필요한가요? 열은 이미 학생을 지칭하는 외래 키로 db에 저장되어 있습니다. – ayengin

답변

0

나는, 그러나, 여기이 선이 난제를 가져 오는 증명할 수 않는 방식으로 최대 절전 모드에 대한 착각 :

당신이 Hibernate는 LAZY 페치를 사용하라는 것 때문에
@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL}) 

, 그것은 다시 당겨 아니에요 참조 된 Class 개체에 대한 Student 개체를 유지했습니다. 이것은 질의 로딩 시간을 돕고, Hibernate는 느린 로딩이 켜져있는 객체 하위 클래스 상속을 최적화합니다. 가져 오기 유형을 EAGER으로 변경하면 예상 한 결과가 표시됩니다.

관련 문제