powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA: mappedBy генерирует много запросов
21 сообщений из 21, страница 1 из 1
JPA: mappedBy генерирует много запросов
    #39433105
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучаю понемногу JPA, заметил, что при использовании mappedBy, запросов генерируется больше.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Entity
@Table(name = "role")
public class Role implements Serializable {

    @Id
    private String user_name;
    @Id
    private String role_name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_name", referencedColumnName = "name")
    private User user;

    ...
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Entity()
@Table(name="user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private Date created_at;
    private Date updated_at;


    @OneToMany(mappedBy = "user")
    public List<Role> roles;

   ...
}





Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<User> cq = cb.createQuery(User.class);
        Root<User> rootUser = cq.from(User.class);
        cq.where(cb.equal(rootUser.get(User_.name), "admin"));
        TypedQuery<User> query = entityManager.createQuery(cq);
        User user = query.getSingleResult();

        log(user.getName());
        for (Role role : user.roles)
            log(role.getRole_name().toString());



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
22:13:23,152 INFO  [org.hibernate.hql.internal.QueryTranslatorFactoryInitiator] (default task-28) HHH000397: Using ASTQueryTranslatorFactory
22:13:23,155 INFO  [stdout] (default task-28) Hibernate: select user0_.id as id1_1_, user0_.created_at as created_2_1_, user0_.name as name3_1_, user0_.updated_at as updated_4_1_ from user user0_ where user0_.name=?
22:13:23,157 INFO  [io.undertow.servlet] (default task-28) com.mezoline.servlet.IndexServlet: admin
22:13:23,157 INFO  [stdout] (default task-28) Hibernate: select roles0_.user_name as user_nam1_0_0_, roles0_.role_name as role_nam2_0_0_, roles0_.user_name as user_nam1_0_1_, roles0_.role_name as role_nam2_0_1_ from role roles0_ where roles0_.user_name=?
22:13:23,161 INFO  [stdout] (default task-28) Hibernate: select user0_.id as id1_1_0_, user0_.created_at as created_2_1_0_, user0_.name as name3_1_0_, user0_.updated_at as updated_4_1_0_ from user user0_ where user0_.name=?
22:13:23,164 INFO  [stdout] (default task-28) Hibernate: select user0_.id as id1_1_0_, user0_.created_at as created_2_1_0_, user0_.name as name3_1_0_, user0_.updated_at as updated_4_1_0_ from user user0_ where user0_.name=?
22:13:23,165 INFO  [stdout] (default task-28) Hibernate: select user0_.id as id1_1_0_, user0_.created_at as created_2_1_0_, user0_.name as name3_1_0_, user0_.updated_at as updated_4_1_0_ from user user0_ where user0_.name=?
22:13:23,167 INFO  [io.undertow.servlet] (default task-28) com.mezoline.servlet.IndexServlet: ADMINISTRATOR
22:13:23,167 INFO  [io.undertow.servlet] (default task-28) com.mezoline.servlet.IndexServlet: USER
22:13:23,169 INFO  [io.undertow.servlet] (default task-28) com.mezoline.servlet.IndexServlet: TEST


Если же в классе User указать связь так:


Код: java
1.
2.
3.
    @OneToMany()
    @JoinColumn(name = "role_name", referencedColumnName = "name")
    public List<Role> roles;




То трех лишних (по моему мнению) запросов не будет:

Код: plaintext
1.
2.
3.
4.
22:17:32,568 INFO  [org.hibernate.hql.internal.QueryTranslatorFactoryInitiator] (default task-31) HHH000397: Using ASTQueryTranslatorFactory
22:17:32,571 INFO  [stdout] (default task-31) Hibernate: select user0_.id as id1_1_, user0_.created_at as created_2_1_, user0_.name as name3_1_, user0_.updated_at as updated_4_1_ from user user0_ where user0_.name=?
22:17:32,573 INFO  [io.undertow.servlet] (default task-31) com.mezoline.servlet.IndexServlet: admin
22:17:32,573 INFO  [stdout] (default task-31) Hibernate: select roles0_.role_name as role_nam2_0_0_, roles0_.user_name as user_nam1_0_0_, roles0_.user_name as user_nam1_0_1_, roles0_.role_name as role_nam2_0_1_ from role roles0_ where roles0_.role_name=?

Если я все правильно понял, то mappedBy должен наоборот оптимизировать этот момент.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433108
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЕсли же в классе User указать связь так:
Код: java
1.
2.
3.
    @OneToMany()
    @JoinColumn(name = "role_name", referencedColumnName = "name")
    public List<Role> roles;



То наше двухстороннее OneToMany вырождается в OneToOne.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433112
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сразу не заметил этого подвоха.
А почему так происходит?
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433117
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user.role_name - сколько ролей у одного юзера?
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433119
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
 user_name	role_name 
admin	ADMINISTRATOR
admin	USER
admin	TEST
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433120
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett
Код: plaintext
1.
2.
3.
 user_name	role_name 
admin	ADMINISTRATOR
admin	USER
admin	TEST

Ааа... К черту нормализацию? ОК.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433123
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ENUM поля в СУБД, они занимают один байт, какой смысл городить еще третью таблицу. К тому же роли определены в XML конфигах.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433134
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
HettИзучаю понемногу JPA, заметил, что при использовании mappedBy, запросов генерируется больше.Просто прими как данность, что для отношения @OneToMany, если ты фетчишь сущность со стороны "One", то JPA никак не оптимизирует выборку со стороны "Many". Не умеет этого ни Хибернейт, ни прочие провайдеры. Не нравятся лишние запросы - выбирай отдельными запросами или нативно.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433158
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

совершенно не специалист, но наигравшись в двух проектах с jpa, определил для себя ряд вещей:

в любой таблице делать сам-по-себе-отдельный-ид, лонг или ууид. понятно, что логин юзера будет уникальный, но лишняя колонка и индекс нынче не очень большой оверхед.

отсюда же вытекает ненужность конфигурирования mappedBy, таблицы буду связаны по колонкам ид, в джаве меньше писанины и мусора, будет
@ManyToOne
private User user;
и все.

двунаправленые связи не делать вообще,
зато не будет рекурсивно циклиться парсер джексона, когда начнешь на этой базе делать веб-сервис, и не придется лепить в сущность еще и джексон аннотации

связи делать только со стороны ManyToOne, достать список ролей для юзера чуть сложнее чем готовый лист - в классе-сущности написать простейший запрос на получения ролей по ид юзера,
зато скажешь сам себе спасибо за отсутствие кучи промежуточных таблиц, когда будешь писать запрос для какого-нибудь развестистого отчета.

послушаем, что скажут специалисты :)
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433159
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий321,

сделал однонаправленную связь, удалил связь на юзера в Role, теперь лишних запросов нет.
Просто тогда я не понимаю в чем оптимизация этого mappedBy.


BlazkowiczHettЕсли же в классе User указать связь так:
Код: java
1.
2.
3.
    @OneToMany()
    @JoinColumn(name = "role_name", referencedColumnName = "name")
    public List<Role> roles;




То наше двухстороннее OneToMany вырождается в OneToOne.

В общем там ничего не вырождается, это я ошибочку допустил, не по тому полую связал, нужно было делать так:

Код: java
1.
2.
3.
    @OneToMany()
    @JoinColumn(name = "user_name", referencedColumnName = "name")
    private List<Role> roles;



Просто работало потому, что у одного пользователя совпало имя с названием роли...
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433169
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettПросто тогда я не понимаю в чем оптимизация этого mappedBy http://stackoverflow.com/a/9108618
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433195
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Видел это, но так и не понял о каких констрейтах говорится. На таблицах у меня нет FK, и все связи прекрасно работают в jpa
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433278
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Constrains - это ограничения (целостности). Ограничения, которые контролирует БД.
Можно, разумеется, и без них, но печально будет просветлиться, грохнув родительскую запись и осиротив миллион "деток".
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433305
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettНа таблицах у меня нет FK
это плохо.
Во первых FK это индексы и быстрота. Во вторых, уже сказали, это последний рубеж защиты.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433310
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я это все прекрасно понимаю, но вопрос тут в другом, оптимизирует ли что-то mappedBy или он только упрощает разработчику жизнь?
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433317
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВо первых FK это индексы и быстрота.
Бывают случаи, когда нужный индекс уже включен в состав другого составного индекса.
В таком случае созданный FK индекс дает оверхед (получаем полностью обратный эффект).
Не знаю как в других СУБД, но в MySQL именно так.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433318
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока для себя я пришел к выводу, что если обратная связь не нужна, то и создавать ее не стоит, меньше запросов будет. Я изначально думал, что при LAZY загрузке всё действо будет происходить при обращении к связи, а не при инициализации объекта.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433320
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettв других СУБД
в других и Java не так
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433323
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123в других и Java не так

JAVA это что, СУБД? Давно?
MySQL - при создании FK создает и соответствующий индекс, который в некоторых случаях становится оверхедом, как я уже выше говорил.
Тот же MS SQL не создает индекс при создании FK, о какой производительности вообще вы говорите?
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433324
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettПока для себя я пришел к выводу, что если обратная связь не нужна, то и создавать ее не стоит, меньше запросов будет. Я изначально думал, что при LAZY загрузке всё действо будет происходить при обращении к связи, а не при инициализации объекта.
Вывод правильный. В данном случае она нафиг не нужна. Список пользователей у которых есть определенная роль будет огромным.
В общем же случае, нужно очень хорошо подумать прежде чем создавать двунаправленную ассоциацию в сущностях.
...
Рейтинг: 0 / 0
JPA: mappedBy генерирует много запросов
    #39433798
natanabrahamjr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не n+1 случаем? ))
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA: mappedBy генерирует много запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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