Ленивая загрузка предназначена для организаций, а не DTO.
Сущность JPA может быть представлена как POJO или Proxy .
Как я объяснил в этой статье , использование EntityManager.find
дает вамPOJO:
Post post = entityManager.find(Post.class, postId);
В то время как метод EtityManager.getReference
предоставляет вам прокси:
Post post = entityManager.getReference(Post.class, postId);
POJO имеет свои базовые свойства, инициализированные, потому что инструкция SELECT была выполнена для извлечения сущности.Прокси не попадает в базу данных при создании.Только идентификатор устанавливается на основе предоставленного идентификатора объекта.Только вы обращаетесь к свойствам Proxy, будет выполняться оператор SELECT.
Прокси также используются для коллекций (например, @OneToMany
или @ManyToMany
), которые по умолчанию используют стратегию FetchType.LAZY
.Как только вы получите доступ к коллекции LAZY, будет выполнен оператор SELECT для извлечения связанной коллекции.
Теперь DTO основан на проекции, следовательно, оператор SELECT выполняется до заполнения DTO.Для этого вы можете сказать, что DTO загружается каждый раз.
DTO гораздо эффективнее, чем объекты для проекций только для чтения, потому что вы загружаете только те столбцы таблицы, которые вы явно запросили.Подробнее о том, как лучше использовать DTO с JPA и Hibernate, читайте в этой статье .