Меня смущает эта аннотация для поля объекта, имеющая тип другого объекта:
@BatchFetch(value = BatchFetchType.JOIN)
В документах EclipseLink для BatchFetch это объясняется следующим образом:
For example, consider an object with an EMPLOYEE and PHONE table in which PHONE has a foreign key to EMPLOYEE. By default, reading a list of employees' addresses by default requires n queries, for each employee's address. With batch fetching, you use one query for all the addresses.
но я не понимаю смысла указания BatchFetchType.JOIN
. Я имею в виду, разве BatchFetch не выполняет объединение в тот момент, когда он извлекает список записей, связанных с сотрудником? Записи типа адреса/телефона извлекаются с использованием внешнего ключа, так что это само соединение, верно?
Тип BatchFetch является необязательным параметром, и для соединения указывается:
JOIN – The original query's selection criteria is joined with the batch query
что это значит? Разве пакетный запрос не является соединением?
Присоединение к отношению и возврат данных, на которые ссылаются, вместе с основными данными — это соединение по выборке. Таким образом, запрос, который возвращает 1 сотрудника с 5 телефонами, приводит к возврату 5 строк, при этом данные в Employee дублируются для строки охвата. Когда это менее идеально, скажем, запрос более 1000 сотрудников, вы прибегаете к отдельному пакетному запросу для этих телефонных номеров. Такой запрос будет выполняться один раз, чтобы вернуть 1000 строк сотрудников, а затем запустить второй запрос, чтобы вернуть все телефоны сотрудников, необходимые для создания считывания сотрудников.
Затем три типа пакетных запросов, перечисленные здесь, определяют, как будет построен этот второй пакетный запрос. Они будут работать по-разному в зависимости от данных и настройки базы данных.
Лучший способ выяснить это — всегда попробовать это с включенным ведением журнала SQL, чтобы увидеть, что он генерирует для вашего сопоставления и запроса. Поскольку это параметры производительности, вам следует протестировать их и записать показатели, чтобы определить, какие из них лучше всего подходят для вашего приложения по мере роста его набора данных.