При добавлении в двунаправленную коллекцию ManyToMany извлекаются все записи, уже имеющие отношение - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть сущность User, сопоставленная пользователями в сущности UserGroup

USER.java

@ManyToMany(mappedBy = "users")
private Set<UserGroup> userGroups;

public void addGroup(UserGroup userGroup){
this.userGroups.add(userGroup);
userGroup.addUser(this);
}

UserGroup.java

@ManyToMany
@JoinTable(name = "group_users", joinColumns = @JoinColumn(name = "group_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id"))
private Set<User> users;

public void addUser(User user) {
   this.users.add(user);
}

У меня есть способ добавить группу к пользователю в UserService:

@Transactional
public void addGroupsToUser(UserAddGroupsCommand userAddGroupsCommand, String username) {
    User user = userRepository.findByUsername(username);
    if (user != null) {
        List<UserGroup> userGroupList = userGroupRepository.findAllById(userAddGroupsCommand.getId());
        for (UserGroup userGroup : userGroupList) {
            user.addGroup(userGroup);
        }
        userRepository.save(user);
    }
}

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

Hibernate: 
select
    users0_.group_id as group_id1_3_1_,
    users0_.user_id as user_id2_3_1_,
    user1_.id as id1_7_0_,
    user1_.email as email2_7_0_,
    user1_.firstname as firstnam3_7_0_,
    user1_.is_admin as is_admin4_7_0_,
    user1_.lastname as lastname5_7_0_,
    user1_.password as password6_7_0_,
    user1_.username as username7_7_0_ 
from
    group_users users0_ 
inner join
    user user1_ 
        on users0_.user_id=user1_.id 
where
    users0_.group_id in (
        select
            usergroup0_.id 
        from
            user_group usergroup0_ 
        where
            usergroup0_.id in (
                ? , ?
            )
    )

Как этого избежать?Есть ли возможность избежать этого без написания собственного запроса, только с помощью аннотаций и методов репозитория JPA?

1 Ответ

0 голосов
/ 26 февраля 2019

При добавлении группы есть 2 выбора:

для выборки групп в вызове пользователя user.getUserGroups().add(group)

select usergroups0_.user_id as user_id2_0_0_, usergroups0_.group_id as group_id1_0_0_, usergroup1_.id as id1_8_1_ 
from group_users usergroups0_ 
inner join UserGroup usergroup1_ on usergroups0_.group_id=usergroup1_.id 
where usergroups0_.user_id=?

для выборки пользователей в вызове группы group.addUser(user)

select users0_.group_id as group_id1_0_0_, users0_.user_id as user_id2_0_0_, user1_.id as id1_7_1_ 
from group_users users0_ 
inner join User user1_ on users0_.user_id=user1_.id 
where users0_.group_id=?

поле пользователя должно быть инициализировано, так или иначе, вы загружаете его лениво или охотно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...