Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate n+1 / 12 сообщений из 12, страница 1 из 1
15.02.2016, 20:48
    #39171807
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
Скажите, такой маппинг исключает проблему 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
15.02.2016, 21:02
    #39171814
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
Нет не исключает
...
Рейтинг: 0 / 0
15.02.2016, 21:54
    #39171841
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
BlazkowiczНет не исключает
Как быть? Убрать лишние анотации и при выборе дочерних делать запрос используя criteria, hql?
...
Рейтинг: 0 / 0
17.02.2016, 09:32
    #39172845
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
С одной стороны, 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
17.02.2016, 09:34
    #39172846
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
JulTКак быть? Убрать лишние анотации и при выборе дочерних делать запрос используя criteria, hql?
Я уже 100 раз отвечал на этот вопрос. Маппинг всегда Lazy. Fetch JOIN/SELECT указывается по надобности в каждом отдельном сценарии для каждого отдельного запроса.
...
Рейтинг: 0 / 0
17.02.2016, 23:07
    #39173629
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
Извините, но я не совсем понимаю как это указывать в каждом отдельном сценарии. Это что, как-то "на лету", динамически менять значение анотаций, или как?(чувствую чушь какую-то спросила). Можете дать ссылку на пример или поясните, пожалуйста, подробнее. Очень хочется докопаться до сути:). А ответы ваши я конечно же поищу
...
Рейтинг: 0 / 0
17.02.2016, 23:18
    #39173635
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
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
18.02.2016, 10:45
    #39173843
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate n+1
JulT,
вам просто отвечают на не заданный вопрос, тут такое бывает.
На самом деле хибернейтовской аннотации
Код: java
1.
@Fetch(value = FetchMode.JOIN)

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


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

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


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