2012-02-22 56 views
3

得到我有項目用戶有權限。權威類型存儲在數據庫中,並與用戶建立多對多關係。@ManyToMany並非所有的值都從DB

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "user_authority", joinColumns = @JoinColumn(name = "uauth_user"), inverseJoinColumns = @JoinColumn(name = "uauth_authority")) 
private Set<Authority> userAuthorities; 

但是,當我試圖獲得選定用戶的所有權限時,我只獲得其中一個權限。 Hibernate只是把它們放在第一個列表中,但忽略了用戶的所有其他權限。

我已經檢查數據庫並存儲這些數據。此外,我找到了解決方案,添加了一個不是JPA註釋。它適用於@Fetch(FetchMode.SUBSELECT),但我仍然不明白它有什麼問題。

+1

您將您的'Set '存儲在Set中。 「權限」是否可以相等? – Seffel 2012-02-22 13:11:01

+0

編號權威機構通過id簡化了比較方法,這對於DB中的所有行都是唯一的。 – 2012-02-22 15:03:01

+1

它應該工作。我剛剛使用EclipseLink和2個實體類User和Authority測試了您的示例。你是如何定義它們的?你是否也定義了實體user_authority(因爲你有第三列)?如果是的話,你是如何定義它的? – perissf 2012-02-22 18:34:05

回答

0

好的問題是在不同的地方。

我的錯是,當我用Hibernate註釋試過它,它只是工程,我開始認爲這是一個註釋問題,但實際上它是由獲得這個值的方法引起的。

雖然重構我們的代碼leae一個錯誤:

return (T) criteria.setMaxResults(1).uniqueResult(); 

他把它轉換爲SQL作爲

SELECT * FROM user OUTER JOIN user_authority ON usr_id = uauth_user INNER JOIN authority ON uauth_authority = auth_id LIMIT 1 

結果爲1,而在我們的例子中,我們設置最大計數此限制刪除所有部門,並從第一線留下第一個權威。但是當我們將Hibernate FetchMode指定爲SUBSELECT時。它在兩個單獨的SQL查詢中執行此獲取。其中主要有限制。

2

以下解決方案適用於任何符合JPA 2.0標準的實現。

user有主鍵id

authority有主鍵id

user_authority有字段user_id,authority_id

實體類用戶

@JoinTable(name = "user_authority", 
    joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, 
    inverseJoinColumns = {@JoinColumn(name = "authority_id", referencedColumnName = "id")}) 
@ManyToMany(fetch = FetchType.EAGER) 
private Set<Authority> authoritySet; 

實體類管理局

@ManyToMany(mappedBy = "authoritySet", fetch = FetchType.EAGER) 
private Set<User> userSet; 

user_authority沒有在JPA實體表示形式。

相關問題