2013-08-30 3 views
4

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

@OneToOne 
@oneToMany 
@ManyToOne 

отношений его делает несколько запросов для каждого выборки.

Может кто-нибудь помочь мне понять, как работают отношения .. ??

ответ

13

Отношения Hibernate работают с различными стратегиями отбора .. !!

Hibernate обеспечивает 4 стратегии для извлечения данных:

ВЫБРАТЬ

@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL) 
@Column(name="id") 
@Fetch(FetchMode.SELECT) 

В этом методе есть несколько SQLs обстреляли. Этот первый загорается для извлечения всех записей в родительской таблице. Оставшиеся уволены для получения записей для каждой родительской записи. Это в основном проблема N + 1. Первый запрос извлекает N записей из базы данных, в этот случай N записей родителя. Для каждого родителя новый запрос получает Ребенок. Поэтому для N родительских запросов N запросов извлекает информацию из таблицы .

РЕГИСТРИРУЙТЕСЬ

@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL) 
@Column(name="id") 
@Fetch(FetchMode.JOIN) 

Это похоже на ВЫБРАТЬ выборки стратегии, за исключением того факта, что все поиска базы данных имеют место авансовые в JOIN выборки в отличие от SELECT, , где это происходит на необходимость основа. Это может стать важным соображением производительности .

подвыбор

@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL) 
@Column(name="id") 
@Fetch(FetchMode.SUBSELECT) 

Два SQLs увольняют. Один для извлечения всех родительских, а второй использует запрос SUBSELECT в предложении WHERE для извлечения всего дочернего элемента, который имеет , соответствующие идентификаторам родителей.

ПАРТИЯ

@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL) 
@Column(name="id") 
@@BatchSize(size=2) 

Карта размера партии к числу родителя, чей ребенок извлекается. Таким образом, мы можем указать количество записей, которые будут выбраны за раз. Но Будет выполнено несколько запросов. !!

один-ко-многим & многие-ко-многим позволяет - присоединиться, Select и подвыбор

много-к-одному & один-к-одному позволяет - Регистрация и выбор


Hibernate также различает (Когда это ассоциации выбираются)

1. Немедленное извлечение -

ассоциация, сбор или атрибут извлекается немедленно, когда Родитель загружается. (Ленивая = «ложь»)

2. коллекции Ленивых выборки -

коллекция извлекается, когда приложение вызывает операцию при этой коллекции. (Это значение по умолчанию для коллекций (ленивая = «истина»)

3. "Extra-ленивый" коллекция выборки -.

отдельных элементы коллекции доступны из базы данных а пытается нужно. Hibernate не извлечь всю коллекцию в памяти, если совсем не нужно (подходит для очень больших коллекций) (ленивый = «экстра»)

4. прокси выборки -

однозначная ассоциация выбирается, когда метод, отличный от идентификатора геттер вызывается на соответствующий объект. (ленивая = «прокси»)

5. "Нет-прокси" выборка -

однозначная ассоциация выбирается, когда переменная экземпляра доступа. По сравнению с прокси выборки, этот подход менее ленивым (ленивым = «не-прокси»)

6. Ленивый атрибут не выборки -.

атрибут или однозначную ассоциацию извлекается, когда экземпляр .(Ленивым = «истина»)

один-ко-многим & многие-ко-многим позволяет Immediate, Layzy, Extra Lazy

много-к-одному & один-к-одному допускает немедленный прокси-сервер, нет прокси

+0

Спасибо, что это помогает. :) – user2731899

Смежные вопросы