HIbernate OneToManyLoader выполняет выбор для каждого элемента в коллекции - PullRequest
0 голосов
/ 09 ноября 2018

Я запускаю приложение grails, которое не поддерживает подвыбор режима гибернации. Каждый элемент в коллекции выбирается с отдельным оператором выбора.

Я нашел это предложение по переполнению стека Hibernate: лучшая практика для извлечения всех ленивых коллекций

entity.collection.size()// call size to force hibernate to load the full collection

Но это вызывает отдельный выбор для каждого элемента в коллекции.

Итак, я обнаружил, что служебный класс на github написан специально для grails. https://gist.github.com/mirasrael/2fb953ee95b0c9d16880e4cfb2477e76

Я запустил его для моей версии Hibernate, но ключевые моменты ....

CollectionLoader loader = new OneToManyLoader(collectionPersister, entityIds.length, sf, LoadQueryInfluencers.NONE) :
loader.loadCollectionBatch(session, entityIds, collectionPersister.getKeyType());

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

Я начал читать доступный исходный код Hibernate, но я не знаю, с чего начать при попытке заполнить эту недостающую функцию.

1 Ответ

0 голосов
/ 10 ноября 2018

Попробуйте это,

 @OneToMany(fetch = FetchType.EAGER)
 @Fetch(value = FetchMode.SELECT)
 @BatchSize(size = 10)
 private Set<Child> child= new HashSet<Child>();

Он выполнит только два запроса, один для родительского и один для дочернего набора. В зависимости от значения размера он загрузит коллекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...