powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate n+1
12 сообщений из 12, страница 1 из 1
Hibernate n+1
    #39171807
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, такой маппинг исключает проблему n+1 запроса в Hibernate:
Код: java
1.
2.
3.
4.
    @OneToMany(orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinColumn(name="client_id", insertable = true, updatable = true)
    @Fetch(value = FetchMode.JOIN)
    private Set<ClientRole> clientRoles = new HashSet<ClientRole>(0);
...
Рейтинг: 0 / 0
Hibernate n+1
    #39171814
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет не исключает
...
Рейтинг: 0 / 0
Hibernate n+1
    #39171841
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНет не исключает
Как быть? Убрать лишние анотации и при выборе дочерних делать запрос используя criteria, hql?
...
Рейтинг: 0 / 0
Hibernate n+1
    #39172845
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С одной стороны, 2 противоречащие друг другу аннотации
Код: java
1.
2.
3.
@OneToMany(orphanRemoval = true, fetch = FetchType.LAZY) // n+1 запрос
и
@Fetch(value = FetchMode.JOIN) // 1 запрос


Было бы логично использовать 2-ю аннотацию, если бы требовалось 2 запроса: @Fetch(value = FetchMode.SELECT) - такая аннотация приводила бы к ленивому селекту из подчиненной таблицы.
А тут поди угадай, что сработает.
Но с другой стороны, есть документация, из которой следует, что будет 1 селект:

Код: plaintext
1.
2.
3.
4.
5.
6.
With the default JPA options, single-ended associations are loaded with a subsequent select if
set to LAZY, or a SQL JOIN is used for EAGER associations. You can however adjust the fetching
strategy, ie how data is fetched by using @Fetch. FetchMode can be  SELECT  (a select is triggered
when the association needs to be loaded) or  JOIN  (use a SQL JOIN to load the association while
loading the owner entity).  JOIN overrides any lazy attribute  (an association loaded through a JOIN
strategy cannot be lazy).
...
Рейтинг: 0 / 0
Hibernate n+1
    #39172846
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTКак быть? Убрать лишние анотации и при выборе дочерних делать запрос используя criteria, hql?
Я уже 100 раз отвечал на этот вопрос. Маппинг всегда Lazy. Fetch JOIN/SELECT указывается по надобности в каждом отдельном сценарии для каждого отдельного запроса.
...
Рейтинг: 0 / 0
Hibernate n+1
    #39173629
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, но я не совсем понимаю как это указывать в каждом отдельном сценарии. Это что, как-то "на лету", динамически менять значение анотаций, или как?(чувствую чушь какую-то спросила). Можете дать ссылку на пример или поясните, пожалуйста, подробнее. Очень хочется докопаться до сути:). А ответы ваши я конечно же поищу
...
Рейтинг: 0 / 0
Hibernate n+1
    #39173635
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTИзвините, но я не совсем понимаю как это указывать в каждом отдельном сценарии. Это что, как-то "на лету", динамически менять значение анотаций, или как?(чувствую чушь какую-то спросила). Можете дать ссылку на пример или поясните, пожалуйста, подробнее. Очень хочется докопаться до сути:). А ответы ваши я конечно же поищу

В профессии программист главный навык это умение находить информацию, вы вроде уже не первый год тут.

http://stackoverflow.com/questions/5435304/how-to-override-hibernate-fetching-strategy-at-runtime

If you're using HQL for your queries, you can specify your eager fetching using the "fetch" keyword, like so:

from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens child
left join fetch child.kittens
If you're using the Criteria Query API, you can specify the fetch mode using setFetchMode

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
...
Рейтинг: 0 / 0
Hibernate n+1
    #39173843
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT,
вам просто отвечают на не заданный вопрос, тут такое бывает.
На самом деле хибернейтовской аннотации
Код: java
1.
@Fetch(value = FetchMode.JOIN)

достаточно, чтобы при обращении главной таблице вложенные записи по умолчанию выбирались тем же селектом с использованием outer join , то есть за 1 запрос.
Это и есть решение проблемы n+1.
Того же можно было бы добиться, используя только JPA аннотацию
Код: java
1.
@OneToMany(orphanRemoval = true, fetch = FetchType.EAGER)


А вам отвечают на вопрос, можно ли это поведение как-то изменить в конкретном запросе. Да, стратегию в запросе/критерии указать можно. Но это другой вопрос.
...
Рейтинг: 0 / 0
Hibernate n+1
    #39173854
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraвам просто отвечают на не заданный вопрос, тут такое бывает.
И тут такой ivanra на белом коне.

ivanra А вам отвечают на вопрос, можно ли это поведение как-то изменить в конкретном запросе. Да, стратегию в запросе/критерии указать можно. Но это другой вопрос.
Да побоку на запрос. Мы понятия не имеем о маппинге ClientRole и его содержимом. Там могут оказаться и ленивые свойства.
...
Рейтинг: 0 / 0
Hibernate n+1
    #39173871
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczМы понятия не имеем о маппинге ClientRole и его содержимом. Там могут оказаться и ленивые свойства.
В том то и дело. Зачем фантазировать и отвечать про то, что не спросили. А для конкретной связи и как она будет работать, в вопросе данных достаточно
...
Рейтинг: 0 / 0
Hibernate n+1
    #39173874
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraЗачем фантазировать и отвечать про то, что не спросили.
Зачем указывать кому-то в интернете что ему делать?
...
Рейтинг: 0 / 0
Hibernate n+1
    #39176340
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чот я не понял.. надо делать чтоль всегда лейзи? т.е. нет, я помню в одной софтине сделал все игер а потом удивлялся происходящим чудесам )) в итоге перешел на вариант лейзи - для коллекций, а для "штучных" полей игер. в принципе с таким подходом вытаскивая даже лист сущностей всю базу целиком в память выгрузить случайно не выйдет. да и потом работать вполне комфортно с вытащенным объектом. если уж очень надо в детаченом объекте иметь доступ к листовым полям, тогда просто инициализирую конкретно это поле и всё.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate n+1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]