Подтвердить что ты не робот

Тип выборки по умолчанию JPA

Из моего понимания @OneToOne и @ManyToOne Аннотации JPA выполняют выборку eager. Я хочу, чтобы они были лениво загружены в мое приложение или, по крайней мере, намекали на это (это то, что по умолчанию для спящего режима). Я начал добавлять аннотацию fetch = FetchType.LAZY

например,

@ManyToOne(optional = false, fetch = FetchType.LAZY)

вместо

@ManyToOne(optional = false)

Это утомительно и подвержено ошибкам. Есть ли способ сделать это на уровне приложений? Возможно, в файле persistence.xml?

4b9b3361

Ответ 1

На сегодняшний день я решил, что Hibernate следует спецификациям JPA с точки зрения сопоставления через аннотации просто потому, что я не получил никаких запросов функций для его конфигурирования, что было удивительно TBH. Как вы отметили, поскольку Hibernate 3.0, что вы хотите, был настроен по умолчанию при использовании файлов сопоставления hbm.xml.

Разрешение этой конфигурации не будет нарушать спецификацию, поскольку предлагается другой ответ.

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

Ответ 2

JPA Spec предполагает, что в большинстве случаев для большинства приложений потребуются отношения singleton по умолчанию, а отношения по умолчанию - по умолчанию. И, по крайней мере, на собственном опыте, это, как правило, желаемая архитектура. Это имеет смысл, поскольку одноэлементные отношения не требуют существенной дополнительной производительности в слое JPA и уровне БД для создания одностороннего соединения по внешнему ключу. Тем не менее, в противоположность этому, многозначные атрибуты создают либо проблему N + 1, либо большие декартовы результирующие, которые получают завышение экспоненциально, поскольку количество элементов в коллекциях и количестве объединений увеличивается, когда используется выборка соединения (хотя Hibernate специально не может обрабатывать ссылки на 2+ активных ассоциаций).

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

Если бы я был на вашем месте, если вы считаете, что это абсолютно полезная функция, которая будет добавлена ​​в спецификацию JPA, я отправлю ее в JCP. С другой стороны, если вы получите это (, то и то...), адресованное в конкретной реализации, то вы окажетесь в так называемом вендоре-lockin. Поэтому я потратил бы лишний час на то, чтобы установить ленивую выборку в атрибутах @ManyToOne @OneToOne и остаться без поставщиков, поэтому, придерживаясь спецификации, если заявить о новой реализации JPA, это будет более чем в 15 раз быстрее, чем Hibernate (или любая другая реализация использование), потребовалось бы почти никаких усилий, чтобы переместить ваш проект в новую реализацию JPA.

Ответ 3

нет. нет ничего об изменении стратегии глобального отбора в спецификации JPA. JPA предлагает для получения 1-1/N-1 ассоциаций EAGER, тогда как для 1-N/M-N это ЛАЗИ. Все реализации JPA должны соответствовать спецификации, которая должна соответствовать требованиям. Я думаю, что разработчик приложения не может изменить это поведение по умолчанию во всем мире, поскольку это самые лучшие практики почти в большинстве случаев, если у вас нет только одного типа связи между всеми объектами, например, 1-1. подумайте, что вы можете установить его в "EAGER" в приложении, которое содержит действительно богатую модель сущности с сложными отношениями и миллионами данных в базе данных. Переопределение стратегии выборки для каждой ассоциации вручную позволяет разработчику взять на себя ответственность за то, что произойдет дальше. это скорее не склонность к ошибкам, а мощная функция.

Ответ 4

Из моего понимания @oneToOne и @ManyToOne JPA аннотации делают нетерпеливый fectch.

JPA гарантирует надежную загрузку по однозначным отношениям, если не объявлено иначе аннотацией или внутри XML сохранения. Для отношений, связанных с коллекцией, по умолчанию используется ленивая загрузка, но ленивая загрузка - это просто подсказка поставщику сохранения, поддерживающая JPA, поэтому вы не можете полагаться на него и должны проверить конкретный провайдер (например, Hibernate, OpenJPA). См. эту ссылку в качестве ссылки и для более глубокого понимания.