2012-02-24 50 views
0

下面是基本映射:十字魂在双向一个一对多的JPA/Hibernate查询,创建

Client { 
    @OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    private Set<Group> groups = new HashSet<Group>(); 
} 

Group { 
    @ManyToOne (cascade=CascadeType.ALL) 
    private Client client = new Client(); 
} 

我遇到的问题是,当我对查询客户端,我得到一个全部客户端为,每个关联组。我的查询非常简单,我已经尝试了标准和HQL。以下是一个示例条件查询:

Criteria crit = getSession().createCriteria(getPersistentClass()); 

    crit.add(Restrictions.like("name", name); 
    crit.add(Restrictions.eq("state", state); 

    return crit.list(); 

我做错了什么?

回答

2

修改您的Client如下映射,

Client { 
    @OneToMany(mappedBy="client",cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    private Set<Group> groups = new HashSet<Group>(); 
} 

从API文档,

You have the ability to either eagerly or lazily fetch associated entities. The fetch parameter can be set to FetchType.LAZY or FetchType.EAGER. EAGER will try to use an outer join select to retrieve the associated object, while LAZY will only trigger a select when the associated object is accessed for the first time. @OneToMany and @ManyToMany associations are defaulted to LAZY and @OneToOne and @ManyToOne are defaulted to EAGER.

阅读API文档here了解更多详情。

1

这是因为渴望获取类型。 Hibernate使用连接将这些组放在同一个查询中。这使客户端倍增。

加入抓取集合通常不是一个好主意。它有几个副作用。你刚刚找到一个。

  • 如果你想避免延迟加载,只是把懒惰关闭(我认为这是注释@LazyCollection(FALSE)
  • 如果你不关心的副作用:你从查询得到多倍的用户仍然内存中的相同实例。您可以将它们减少到不同实例的列表。
  • HQL实际上并没有考虑到这个选项。你需要明确地join fetch