Hibernate массовое извлечение (batch fetching) формирование запроса

Изучаю Hibernate, читаю "Hibernate in action". В теме "Массовое извлечение" сказано, что можно пометить класс аннотацией @org.hibernate.annotations.BatchSize(size = 10). В таком случае при отложенной инициализации вложенных коллекций, при инициализации прокси объектов в одном запросе может быть инициализировано до 10 объектов.

@Entity
@org.hibernate.annotations.BatchSize(size = 10)
@Table(name = "USERS")
public class USER{

   // ...

}

@Entity
@Table(name = "ITEM")
public class Item{

  @ManyToOne(fetch = FetchType.lazy)
  private User seller;

  // ....

}

С данными классами выполняется следующий код

List<Item> items = em.createQuery("select i from Item i").getResultList;
//select * from ITEM

for (Item item : items){
  assertNotNull(item.getSeller().getUsername());
  //select * from USER where ID in (?,?,?,?,?,?,?,?,?,?)
}

Предполагается, что при обходе массива будут формироваться запросы для поиска сразу по нескольким ID (до 10).

Но не понятно в какой момент этот запрос формируется (заполняется искомыми ID) и в какой выполняется?

На каждом шаге цикла обхода массива мы уже оцениваем данные элемента массива assertNotNull. Т.е. необходимо каждый раз выполнять запрос к БД и тогда концепция массового запроса не работает. А если предположить, что запрос выполняется до оценки элементов, то не понятно в какой момент происходит заполнение его данными о искомых ID.

Соответственно, как происходит заполнение запроса для получения данных при использовании аннотации @org.hibernate.annotations.BatchSize(size = 10)? В какой момент выполняется этот запрос?


Ответы (0 шт):