Hibernate:从多对多关系中删除元素时性能不佳

时间:2009-08-06 06:39:20

标签: performance hibernate

我必须具有多对多关系的类(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>

1 个答案:

答案 0 :(得分:1)

由于您正在调用userSet.getUsers().remove(user),因此系统会提取特定UserSet的所有用户。对延迟集合执行任何操作都会导致获取集合。你能做的是:

1)如果userSets的基数低于用户的基数(例如,给定的用户只属于少量的userSets),您可以切换此关系的反向结束并调用user.getUserSets().remove(userSet) - 我假设您想要仅删除关联,而不删除实际实体。

OR

2)您可以定义命名SQL查询以从T_UM_USERS2USER_SETS表中删除关联行并执行它。