2015-08-13 1 views
12

Я новичок в JPA, и я пытаюсь использовать граф сущности. И я понял, когда я извлекаю данные, мне нужно указать, какой EntityGraphType я хочу использовать.Какова разница между FETCH и LOAD для графика Entity JPA?

Я читал спецификацию JPA2.1, но я до сих пор не знаю, как я могу использовать эти 2 варианта правильно ...

вопрос является ...

  • , какой вариант следует использовать, если У меня нет каких-либо конкретных требований?
  • Какова конкретная ситуация, когда мне нужно использовать Fetch и Load?

ответ

14

Начну с ответа на вторую часть вашего вопроса.

Какова конкретная ситуация, когда мне нужно использовать Fetch and Load?

Есть два основных способа загрузки сущности в JPA, нетерпеливый загрузки и ленивый загрузки. При активной загрузке объект сразу загружается в момент загрузки родителя. При ленивой загрузке объект загружается только тогда, когда вызывается фактический геттер для этого объекта. Высокопроизводительные приложения, как правило, предвзяты к ленивой загрузке, потому что не очень приятно заставить конечного пользователя ждать, когда вся таблица или даже группа таблиц загрузится при запуске приложения. Теперь на ваш второй вопрос.

В качестве стратегии вы указываете FETCH, импортируя javax.persistence.fetchgraph в файл, содержащий объект. В этом случае все атрибуты, указанные в графе сущности, будут обрабатываться как FetchType.EAGER, и все атрибуты , а не, будут указаны как FetchType.LAZY. С другой стороны, если вы указали LOAD как свою стратегию, импортировав javax.persistence.loadgraph, тогда все атрибуты, указанные в графе сущности, также являются FetchType.EAGER, но атрибуты, не указанные, используют свой указанный тип или значение по умолчанию, если объект ничего не указал.

какой вариант использовать, если у меня нет каких-либо конкретных требований?

Это, как говорится, маловероятно, что у вас нет конкретного требования. По крайней мере, вам нужно, чтобы ваше веб-приложение работало быстро. По этой причине вам, вероятно, следует по умолчанию использовать ленивую загрузку. Использование графика FETCH является хорошим вариантом, потому что по умолчанию для него требуется ленивая загрузка , за исключением в нескольких особых случаях, когда вы считаете, что атрибут должен быть загружен.

Вот link to a great blog, который объясняет все это подробно, а также образцы кода.

+0

Благодарим вас за ответ вопрос! Я мог понять, как правильно использовать эти параметры. Я думал, что если я использую опцию fetch, я не могу получить данные подкласса, но я все еще могу это сделать, если я вызову метод getter, но данные будут извлекаться из базы данных, когда я вызываю getter, а не загрузку родительского класса. –

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