Тип выборки по умолчанию JPA
Из моего понимания @OneToOne
и @ManyToOne
Аннотации JPA выполняют выборку eager
. Я хочу, чтобы они были лениво загружены в мое приложение или, по крайней мере, намекали на это (это то, что по умолчанию для спящего режима). Я начал добавлять аннотацию fetch = FetchType.LAZY
например,
@ManyToOne(optional = false, fetch = FetchType.LAZY)
вместо
@ManyToOne(optional = false)
Это утомительно и подвержено ошибкам. Есть ли способ сделать это на уровне приложений? Возможно, в файле persistence.xml?
Ответы
Ответ 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). См. эту ссылку в качестве ссылки и для более глубокого понимания.