2010-01-06 79 views
3

我的問題似乎很簡單,但我似乎無法找到有效的答案。我有一個Hibernate實體,它與另一個實體的ManyToMany關聯,默認情況下會延遲訪問。我想創建一個Criteria,它將返回帶有ManyToMany關聯的Entity,並且熱切地加載它。休眠標準:急切加載ManyToMany集合

這裏是實體問題(與不相關的部分去掉):

@Entity 
public class Order { 

    @ManyToMany 
    private List<Item> items; 

    @ManyToMany 
    private List<Discount> discountEntries; 

    ... 

} 

這裏是迄今爲止我明顯企圖和結果:

Criteria criteria = getSession().createCriteria(Order.class) 
           .setFetchMode("items", FetchMode.SELECT) 
           .setFetchMode("discountEntries", FetchMode.SELECT); 
criteria.list(); 

- 加載項懶洋洋地

Criteria criteria = getSession().createCriteria(Order.class) 
           .setFetchMode("items", FetchMode.JOIN) 
           .setFetchMode("discountEntries", FetchMode.JOIN); 
criteria.list(); 

- 無法取多個行李

Criteria criteria = getSession().createCriteria(Order.class) 
           .createAlias("items", "items", CriteriaSpecification.INNER_JOIN) 
           .setFetchMode("items", FetchMode.JOIN) 
           .createAlias("discountEntries", "discountEntries", CriteriaSpecification.INNER_JOIN) 
           .setFetchMode("discountEntries", FetchMode.JOIN); 
criteria.list(); 

- 返回一個空列表

編輯:添加另一種多對多關聯作爲這似乎是問題的一部分。

+0

我已經設法通過setFetchMode(「items」,FetchMode.JOIN)實現此目的通過更改列表設置(這擺脫了「多袋」問題)。這會導致外部連接,然而,還會產生笛卡爾連接。我正在尋找一種方法來實現這一點... – Zecrates 2010-01-11 05:28:02

回答

2

獲取的收集與LAZY設置和:

List list = criteria.list(); 
Hibernate.initialize(list); 

這將立即對其進行初始化,只是這種情況。

+0

要添加到您的答案 - 這將導致外部聯接,除非您在實體中使用@Fetch(FetchMode.SUBSELECT)關聯。 – Zecrates 2010-01-20 14:50:43

2

你試過了:@ManyToMany(fetch = FetchType.EAGER)?結果是什麼?

+2

它正確地加載項目 - 熱切地,但我只想爲一個標準,而不是所有的時間這樣做。因此我需要一些方法來在Criteria上加載它。 – Zecrates 2010-01-06 11:24:39