Понимание Hibernate hibernate.max_fetch_depth и hibernate.default_batch_fetch_size

Hibernate documenation предоставляет некоторые свойства конфигурации Hibernate. Среди них

hibernate.max_fetch_depth

Устанавливает максимальную "глубину" для дерева выбора внешнего соединения для однократного ассоциаций (один к одному, много-к-одному). A 0 отключает внешнюю внешнюю присоедините выборку. например рекомендуемые значения между 0 и 3

hibernate.default_batch_fetch_size

Устанавливает размер по умолчанию для пакетной выборки Hibernate. например рекомендуемые значения 4, 8, 16

Я новичок в Hibernate, может кто-то, пожалуйста, помогите мне в понимании этого с примером.

Спасибо заранее.

Ответ 1

max_fetch_depth: Представьте себе человека и адресную сущность. Каждый человек живет по одному адресу (очень простая система), но многие люди могут жить по тому же адресу. В объектной модели у Человека, вероятно, будет свойство адреса. Это будет отображаться как много-к-одному (как говорит док). Теперь, выбирая Person из базы данных, hibernate встречает это свойство. В базе данных это столбец с внешним ключом в таблице адресов. Чтобы получить связанный объект, можно использовать соединение с этой таблицей. Полученные данные будут использованы для заполнения объекта Address, который будет установлен на свойство адреса для человека. В этом смысле Hibernate обходит граф объекта при извлечении объекта. Теперь, что, если Адрес имел собственность Город? Это также было бы много-к-одному и привело бы к объединению по той же логике. Что, если у Города была собственность? То же самое. Выполнение многих объединений было бы плохо для производительности. В какой-то момент было бы лучше сделать отдельный выбор, получить данные из кеша или ввести прокси. Это свойство конфигурации определяет, сколько объединений hibernate будет проходить путем соединения при извлечении данных.

default_batch_fetch_size: Это свойство очень низкого уровня, которое определяет, сколько строк Hibernate будет запрашивать драйвер JDBC для извлечения/загрузки при запросе ассоциации коллекции. Если вы будете запрашивать все города в стране (предыдущий пример), то, загружая данные партиями через соединение JDBC, процесс получения данных через и в память как объекты будет более упорядоченным. По сравнению с кольцом для выполнения запроса для приложения для обработки данных потребуется, однако, как правило, он незначителен. Обычно оставить свойство конфигурации значением по умолчанию будет правильным.