JPA / Hibernate запрашивает, но не назначает подобъект - PullRequest
2 голосов
/ 19 декабря 2011

ОК, я думаю, что в моем понимании JPA / Hibernate есть некоторые недостатки.У меня есть две таблицы: STUDENTS, которая представляет студента, и 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 правильно выполняет запрос, объединяет таблицы и даже возвращает столбцы таблицы ученика в проекции запроса:

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 не равен нулю и является правильным.Я уверен, что я делаю что-то не так, но что?

1 Ответ

0 голосов
/ 16 июля 2012

Возможно, я ошибаюсь из-за того, как hibernate выполняет выборку, однако эта строка прямо здесь может доказать вашу точку отсчета:

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

Поскольку вы говорите Hibernate использовать LAZY выборку, это не таквозврат постоянных объектов Student для объекта Class, на который есть ссылки.Это помогает со временем загрузки запроса, Hibernate оптимизирует наследование подклассов объектов с включенной отложенной загрузкой.Если вы измените тип выборки на EAGER, я думаю, вы увидите ожидаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...