我想知道如何在将新的条目添加到该集合中,以防止从双向Manytomany收集中检索所有条目。我有用户实体,与用户组实体有双向关系。当我在用户实体中添加组时,它将用户添加到组以及用户组为父。问题是,如果我向用户添加了很多组(假设20),则将用户也将添加到每个组中,并且每个组都从每个组中检索所有用户(每组100 )。这使交易需要大量时间并显示出明显的滞后,而我只想将用户组插入用户的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=?
如果您不需要知道组中的哪些用户(在应用程序中显示),则进行单向映射。从UserGroup类中删除Set<User> users
。
在用户类中使用@jointable替换绘图:
@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);
}
尝试自定义查询以获得更好的性能
from UserGroup g left join fetch g.users where g.id in :IDS
以这种方式,每个组中的用户将被加载到一个查询中,而不是在n 1个查询中加载。
更改 @ManyToMany(FetchType.EAGER)
并不有效,因为当用户将始终加载用户群,也不使用。
使用@EntityGraph
与join fetch
查询相同。