JPA / Hibernate-прокси не извлекает данные реальных объектов, устанавливает все свойства в null - PullRequest
7 голосов
/ 20 января 2012

Я использую Hibernate с JPA и имею отношение, которое выглядит следующим образом:

public class PencilImpl implements Pencil {

    @ManyToOne(targetEntity = PersonImpl.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "owner", nullable = false)
    private Person owner;

    ...

    @Override
    public final Person getOwner() {
        return owner;
    }
}

Так как я начал использовать тип извлечения LAZY, каждый раз, когда я пытаюсь получить владельца карандаша ( Карандаш).getOwner ) Я получаю ненулевой объект, для которого все его внутренние свойства установлены в нуль.

Мне кажется, что прокси, созданный Hibernate, не извлекает реальный объект из базы данных, когда это необходимо.

Есть идеи?Спасибо:)

Ответы [ 2 ]

6 голосов
/ 20 января 2012

Это просто, как Hibernate реализует отложенную загрузку.Это даст вам прокси-объект вместо экземпляра вашего класса сущности.Когда вы говорите

ненулевой объект, для которого все его внутренние свойства имеют значение null

, это, вероятно, то, что вы видели в отладчике, верно?Вам не нужно беспокоиться об этом, когда вы получите доступ к любому из этих свойств через код или через вызов внутри отладчика, Hibernate загрузит данные из БД в фоновом режиме, создаст экземпляр вашего класса сущности и все вызовыпрокси-объект будет прозрачно делегирован фактической сущности.Так что обычно, и в идеале вам не нужно заботиться о различении объекта-сущности Hibernate proxy <->.

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

  1. Производительность: при доступе к элементам лениво загруженной коллекции в цикле ленивая загрузка действительно может замедлить работу вашего приложения
  2. Наследование: если ваша модель данных использует наследование, будьте очень осторожны с instanceof и приведением,Прочитайте этот вопрос SO о том, как проверить, является ли объект прокси-сервером Hibernate и как преобразовать его в объект реальной сущности
2 голосов
/ 27 января 2012

Как предположил Дж. Б. Низет, модификатор final в методах получения моих классов связывался с прокси, которые hibernate создает для отложенных загруженных отношений.

...