Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 添加到双向ManyToMany集合将检索已存在关联的所有条目_Hibernate_Jpa_Many To Many - Fatal编程技术网

Hibernate 添加到双向ManyToMany集合将检索已存在关联的所有条目

Hibernate 添加到双向ManyToMany集合将检索已存在关联的所有条目,hibernate,jpa,many-to-many,Hibernate,Jpa,Many To Many,我在UserGroup实体中有用户映射的用户实体 USER.java @ManyToMany(mappedBy = "users") private Set<UserGroup> userGroups; public void addGroup(UserGroup userGroup){ this.userGroups.add(userGroup); userGroup.addUser(this); } @ManyToMany @JoinTable(name = "group_u

我在UserGroup实体中有用户映射的用户实体

USER.java

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

public void addGroup(UserGroup userGroup){
this.userGroups.add(userGroup);
userGroup.addUser(this);
}
@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);
}

如何避免这种情况?如果不编写自己的查询,只使用注释和JPA存储库方法,是否可以避免这种情况?

添加组时,有两种选择:

用于在用户调用中获取组
user.getUserGroups().add(group)

用于获取组中的用户调用
group.addUser(user)


用户字段需要初始化,不管是惰性加载还是急切加载

添加组时,有两个选择:

用于在用户调用中获取组
user.getUserGroups().add(group)

用于获取组中的用户调用
group.addUser(user)


用户字段需要初始化,不管是惰性加载还是急切加载

是的,但是为什么Hibernate会从我想要添加该用户的每个组中选择所有用户。我的意思是,为什么不直接将user\u id group\u id插入联接表group\u users,而不是从group\u users中选择与我尝试插入的用户没有关系的所有条目?因为您正在访问它。Hibernate不知道要对该集合执行什么操作。这就是它的工作原理。如果需要,您仍然可以对该表执行本机SQL插入。如果你想完全控制查询,JPA是不好用的。现在就明白了。但实体图是否解决了此问题?否。如果使用提取图,则只有实体图指定的属性才会被视为提取类型。谢谢你,Peter。那么你对此有什么建议?我应该写查询吗?据我所知,我无法将条目插入联接表。是的,但为什么Hibernate会从我要添加该用户的每个组中选择所有用户。我的意思是,为什么不直接将user\u id group\u id插入联接表group\u users,而不是从group\u users中选择与我尝试插入的用户没有关系的所有条目?因为您正在访问它。Hibernate不知道要对该集合执行什么操作。这就是它的工作原理。如果需要,您仍然可以对该表执行本机SQL插入。如果你想完全控制查询,JPA是不好用的。现在就明白了。但实体图是否解决了此问题?否。如果使用提取图,则只有实体图指定的属性才会被视为提取类型。谢谢你,Peter。那么你对此有什么建议?我应该写查询吗?据我所知,我不能在联接表中插入条目。
@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: 
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 (
                ? , ?
            )
    )
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=?
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=?