2010-01-06 78 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