2011-07-19 20 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)。然后,它会为该关联运行一个单独的选择,并且您不会受到欺骗。