我必须具有多对多关系的类(UserSet和User)(即每个用户都可以属于某些UserSet)。在数据库中有一个UserSet表,一个用户表和一个'在'之间'表(UsersToUserSets)。 现在,如果我想通过
从UserSet中删除用户 userSet.getUsers().remove(user);
session.flush()
Hibernate首先获取属于userSet的所有用户,然后删除一个用户并更新“inbetween”表。
由于可能有数千名用户属于UserSet,因此这对性能非常不利。有没有办法避免所有用户被提取?
映射文件的有趣部分如下所示:
<class name="...UserSet">
...
<set name="users" table="T_UM_USERS2USER_SETS">
<key column="FK_USER_SET_ID" />
<many-to-many column="FK_USER_ID"
class="...User" />
</set>
...
</class>
<class name="...User">
...
<set name="userSets" table="T_UM_USERS2USER_SETS" inverse="true">
<key column="FK_USER_ID" />
<many-to-many column="FK_USER_SET_ID" class="...UserSet" />
</set>
</class>
答案 0 :(得分:1)
由于您正在调用userSet.getUsers().remove(user)
,因此系统会提取特定UserSet的所有用户。对延迟集合执行任何操作都会导致获取集合。你能做的是:
1)如果userSets的基数低于用户的基数(例如,给定的用户只属于少量的userSets),您可以切换此关系的反向结束并调用user.getUserSets().remove(userSet)
- 我假设您想要仅删除关联,而不删除实际实体。
OR
2)您可以定义命名SQL查询以从T_UM_USERS2USER_SETS
表中删除关联行并执行它。