2016-09-12 6 views
1

Мое приложение использует Hibernate для извлечения данных из базы данных. Сегодня я отлаживал свое приложение и наткнулся на загрузку EAGER.Hibernate загружает все сущности, игнорируя нагрузку LAZY

@Table(name = "orders") 
@Entity 
public class Order implements Serializable { 
@OneToMany(fetch = FetchType.EAGER, mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) 
     private List<DishQuantity> dishes = new ArrayList<>(); 
} 

Я изменил его на нагрузку ленивы, как это:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) 
    private List<DishQuantity> dishes = new ArrayList<>(); 

Когда я делаю вызов базы данных от службы с помощью DAO я получаю результат, как и следовало ожидать, лениво загруженные объекты больше не доступны:

lazy loading from service

Но когда я иду на запрос и пытается получить объект с помощью Entity менеджера я получаю это:

enter image description here

Похоже, Hibernate все равно загружает все объекты, но после того, как сделка закрыта, LAZY объекты отбрасывают, не так ли? Но в любом случае он получил все сущности из БД и вообще не улучшил производительность БД. Есть ли способ заставить Hibernate не загружать LAZY-объекты даже во время транзакции и уменьшить нагрузку на БД?

ответ

1

В обоих случаях они загружаются лениво, но вы запускаете инициализацию в отладчике (первый раз после закрытия закрытого Session, второй раз во время активного Session).

Вы можете enable SQL logging проверить, какие запросы выполняются в db.