gpt4 book ai didi

java - 添加新条目时如何防止从双向 ManyToMany 集合中检索所有条目

转载 作者:行者123 更新时间:2023-11-30 05:45:37 24 4
gpt4 key购买 nike

我想知道在向该集合添加新条目时如何防止从双向 ManyToMany 集合中检索所有条目。我有 User 实体,它与 UserGroup 实体具有双向关系。当我在用户实体中添加组时,它将用户添加到组中,并且 UserGroup 是父级。问题是,如果我向用户添加很多组(比如说 20 个),那么用户也会被添加到每个组,并且从每个组检索所有用户(每组 100 多个)。它使事务花费大量时间并显示出明显的延迟,而我只想将 UserGroup 插入到 User 的 userGroups 集合中,而不需要从这些组中选择其他用户。

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);
}

使用方法

@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);
}
}

所以我可以在控制台中看到,所有连接表条目都是为我正在迭代的组选择的

已编辑:这是执行的代码,我不确定为什么。

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=?

最佳答案

如果您不需要知道哪些用户在组中(在应用程序中显示),则进行单向映射。删除Set<User> users来自 UserGroup 类。

在 User 类中使用@JoinTable 而不是mappedBy:

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

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

关于java - 添加新条目时如何防止从双向 ManyToMany 集合中检索所有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com