Hibernate: плохая производительность при удалении элемента из отношения «многие ко многим» - PullRequest
0 голосов
/ 06 августа 2009

У меня есть классы (UserSet и User), которые имеют отношение «многие ко многим» (то есть каждый пользователь может принадлежать к некоторым наборам пользователей). В базе данных есть таблица пользовательских наборов, пользовательская таблица и промежуточная таблица (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 Ответ

1 голос
/ 06 августа 2009

Все пользователи для определенного набора пользователей извлекаются, потому что вы звоните userSet.getUsers().remove(user). Выполнение любой операции над отложенной коллекцией вызывает выборку коллекции. Что вы можете сделать, это:

1) Если количество пользовательских наборов меньше, чем у пользователей (например, данный пользователь будет принадлежать только нескольким пользовательским наборам), вы можете переключить обратную сторону этого отношения и вызвать user.getUserSets().remove(userSet) ассоциация только и не фактическая сущность.

OR

2) Вы можете определить именованный запрос SQL, чтобы удалить строку ассоциации из таблицы T_UM_USERS2USER_SETS и выполнить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...