2012-02-24 6 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

詳細はAPIドキュメントhereを読む、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.

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

Clientのあなたのマッピングを変更します。

1

これは、フェッチタイプが熱心であるためです。 Hibernateは、ジョインを使って同じクエリにグループを入れています。これはクライアントを増やします。

コレクションのフェッチ結合は、通常はお勧めできません。いくつかの副作用があります。あなたはただ見つけました。

  • あなたが遅延読み込みを避けたい場合は、副作用を気にしない場合は、単に
  • (私はそれが注釈@LazyCollection(FALSE)だと思う)怠惰をオフにする:あなたは、クエリから得た逓倍クライアントがまだありますメモリ内の同じインスタンス。異なるインスタンスのリストにそれらを減らすことができます。
  • HQLでは実際にこのオプションを考慮していません。それらを明示的にjoin fetchする必要があります。
関連する問題