2009-08-06 63 views
-1

我必須具有多對多關係的類(UserSet和User)(即每個用戶都可以屬於某個UserSets)。在數據庫中有一個UserSet表,一個用戶表和一個'在兩者之間'表(UsersToUserSets)。 現在,如果我想通過做休眠:從多對多關係中刪除元素時性能不佳

userSet.getUsers().remove(user); 
session.flush() 

休眠用來刪除USERSET用戶第一次獲取所有用戶屬於USERSET,然後刪除一個用戶,並更新「其間」表。

由於可能有成千上萬的用戶屬於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

特定USERSET所有用戶都是牽強,因爲你打電話userSet.getUsers().remove(user)。對懶惰集合執行任何操作會導致獲取集合。你可以做的是:

1)如果userSets基數低於用戶(例如,給定的用戶將只屬於少數用戶集),你可以切換這個關係的反向結束並調用user.getUserSets().remove(userSet) - 我假設在這裏您只想移除協會而不是實際的實體。

OR

2)您可以定義一個名爲SQL查詢,以便從T_UM_USERS2USER_SETS表中刪除關聯行並執行它。

+0

謝謝,你的第一個建議做到了。我已經嘗試了第二個,雖然它本身是有效的,但在程序的其他部分出現了一些問題(即在同一個會話中,集合與數據庫沒有相同的狀態,依此類推) 。 – Ridcully 2009-08-06 07:29:47