2011-07-19 39 views
1

我有兩個實體:用戶和地址。用戶有一個「地址」屬性:問題使用條件和提取類型渴望

@OneToMany (mappedBy="user", fetch=FetchType.EAGER) 
public List<Adress> getAddress() { 
    return this.address; 
} 
public void setAddress(List<Adress> address) { 
    this.address= address; 
} 

的提取類型是渴望如上所示。

我想使用標準,以獲得用戶的列表如下:

List<User> p=session.createCriteria(User.class).list(); 

不幸的是它被重複的用戶,如果用戶有多個地址。在關閉提前取回的情況下,它不會重複。如何使用Criteria獲取沒有重複項目的用戶列表?

回答

3

不建議將*對多關係映射爲FetchType.EAGER。如果您需要進行預先抓取,您可以在每個查詢的基礎上進行。這就是說,當你使用FetchType.EAGER,休眠switches to an outer join select,因爲這是什麼使最有意義的情況下,渴望提取是真正相關的。當然,外連接會導致你看到的行爲。我建議您刪除FetchType.EAGER並編寫適當的查詢來獲取所需的數據。

不太推薦的替代方法是將@Fetch(FetchMode.SELECT)添加到您的映射中。這意味着每次加載用戶時,都會發出兩個選擇:一個用於用戶,另一個用於地址。這基本上和你使用懶惰關係一樣,所以有什麼意義呢?

+0

我需要在幾乎所有的方法中獲取用戶列表,否則,我得到許多懶惰沒有會話打開...例外。無論如何,即使我會按照你所說的每個查詢來完成,問題仍然存在。 – cracq

+0

+1解釋和我的更正。 –

+1

@cracq:對於LazyInitializationExceptions而言,提前取出正是錯誤的解決方案。請參閱[我的答案](http://stackoverflow.com/questions/6709750/proper-usage-of-spring-mvc-3-with-hibernate-spring-orm/6710885#6710885)瞭解如何解決這些問題。查看「會話管理」。您可能還會發現[這個答案](http://stackoverflow.com/questions/6722158/best-way-to-handle-hibernate-sessions-in-a-layered-spring-mvc-web-application/6723767#6723767 )有用。 –

0

設置mycrit.setFetchMode("address", FetchMode.SELECT)。然後,它會爲該關聯運行一個單獨的選擇,並且您不會受到欺騙。