Разница между FetchType LAZY и EAGER в Java Persistence API? - PullRequest
477 голосов
/ 07 июня 2010

Я новичок в Java Persistence API и Hibernate.

В чем разница между FetchType.LAZY и FetchType.EAGER в Java Persistence API?

Ответы [ 14 ]

1 голос
/ 29 августа 2016

public enum FetchType extends java.lang.Enum Определяет стратегии для извлечения данных из базы данных.Стратегия EAGER - это требование времени выполнения провайдера постоянства, что данные должны извлекаться с нетерпением.Стратегия LAZY - это подсказка среде выполнения персистентного поставщика о том, что данные должны извлекаться лениво при первом обращении к ним.Реализация позволяет охотно получать данные, для которых указана подсказка стратегии LAZY.Пример: @Basic (fetch = LAZY) protected String getName () {возвращаемое имя;}

Источник

0 голосов
/ 01 июля 2019

Я хочу добавить эту заметку к тому, что сказал «Кён Хван Мин» выше.

Предположим, вы используете Spring Rest с этим простым архитектором:

Контроллер <-> Сервис <-> Репозиторий

И вы хотите вернуть некоторые данные в интерфейс, если вы используете FetchType.LAZY, вы получите исключение после того, как вернете данные в метод контроллера, так как сеанс закрыт в Сервисе, поэтому JSON Mapper Object не могу получить данные.

Существует три распространенных варианта решения этой проблемы, в зависимости от дизайна, производительности и разработчика:

  1. Самый простой - использовать FetchType.EAGER, чтобы сеанс все еще оставался живым при методе контроллера.
  2. Антишаблоны Решения, позволяющие оживить сеанс до завершения выполнения, создают огромную проблему с производительностью в системе.
  3. Рекомендуется использовать FetchType.LAZY с методом преобразователя для передачи данных из Entity в другой объект данных DTO и отправки их в контроллер, поэтому исключений нет, если сеанс закрыт.
0 голосов
/ 01 апреля 2017

LAZY: он лениво выбирает дочерние сущности, т.е. во время выборки родительской сущности он просто выбирает прокси (созданный cglib или любой другой утилитой) дочерних сущностей, а когда вы получаете доступ к любому свойству дочерней сущности, тогда он фактически извлекается в спящем режиме.

EAGER: извлекает дочерние объекты вместе с родителем.

Для лучшего понимания перейдите к документации Jboss или вы можете использовать hibernate.show_sql=true для своего приложения и проверить запросы, выданные hibernate.

0 голосов
/ 06 марта 2014

@ drop-shadow, если вы используете Hibernate, вы можете вызвать Hibernate.initialize() при вызове метода getStudents():

Public class UniversityDaoImpl extends GenericDaoHibernate<University, Integer> implements UniversityDao {
    //...
    @Override
    public University get(final Integer id) {
        Query query = getQuery("from University u where idUniversity=:id").setParameter("id", id).setMaxResults(1).setFetchSize(1);
        University university = (University) query.uniqueResult();
        ***Hibernate.initialize(university.getStudents());***
        return university;
    }
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...