2011-07-19 17 views
1

私は2つのエンティティUserとAddressを持っています。ユーザーには「アドレス」プロパティがあります。Criteriaとフェッチタイプを使用した問題

@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(); 

ユーザーが複数のアドレスを持っている場合残念ながら、それは繰り返しのユーザーを取得します。 eager fetchingがオフになっていると、重複して取得されません。どのように基準を使用して繰り返し項目なしのユーザーのリストを取得できますか?

答えて

3

*多対多関係をFetchType.EAGERとしてマップすることはお勧めできません。熱心なフェッチが必要な場合は、クエリごとに実行します。つまり、FetchType.EAGER、Hibernate switches to an outer join selectを使用すると、熱心なフェッチが本当に適切な状況で最も理にかなっています。もちろん、外部結合は、あなたが見ている動作を引き起こします。 FetchType.EAGERを削除し、適切なクエリを作成して、必要なデータを取得することをお勧めします。

推奨されていない方法は、@Fetch(FetchMode.SELECT)をマッピングに追加することです。つまり、ユーザーをロードするたびに、ユーザー用とアドレス用の2つの選択が行われます。これは、とにかく怠惰な関係を使用していた場合と本質的に同じです。その点は何ですか?

+0

私はユーザーリストを取得するほとんどすべての方法でeager fetchingが必要です。そうでなければ、セッションが開いていないという例外が多く発生します。とにかく、私はあなたが言うように、クエリごとにそれをやっていますが、問題は依然として残っています。説明と私の修正のために – cracq

+0

+1。 –

+1

@cracq:Eagerフェッチは、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)。その後、アソシエーションのための別の選択を実行し、あなたはダストを取得しません。

関連する問題