2011-01-14 3 views
1
@ManyToOne 
@JoinColumn(name = "play_template_id", table = "team_play_mapping") 
public Play getPlay() { 
    return play; 
} 

public void setPlay(Play play) { 
    this.play = play; 
} 

デフォルトでは、これは熱心な負荷です。私はそれを取得することができますので、それは怠惰な読み込みを行わずにキャッシュから再生オブジェクトを読み取りますか?私は、熱心な読み込みで結合クエリを実行するように強制し、したがってキャッシングを行わないように修正していますか?ManyToOneのhibernateオブジェクトを遅延ロードせずにキャッシュすることはできますか?

+0

キャッシュはどこですか? L1、L2、 – Bozho

答えて

2

eager loadingとlazy loadingはフェッチ戦略です。これは、 "熱心な"読み込みを指定するとできるだけ少ない数のクエリを実行し、 "遅延"を指定すると、そのオブジェクトのクエリをできるだけポストしてポストします(より多くのクエリを実行する危険性があります)。したがって、キャッシュから何かを取得したい場合は、遅延ローディング戦略が必要です。つまり、必要でなければデータベースから取得しないでください。

ただし、どのコードがクエリを実行しているかに基づいて特定のフェッチプロファイルを適用することができます。たとえば、コードのある時点で、あなたの質問はPlayを熱心に読み込む方が良いことを知っていますが、後であなたはPlayを怠惰に読み込むほうがよいでしょう。

http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-fetching-profiles

+0

JPAアノテーション(私たちが使用する)とxmlプロファイルの仕様を同時にアプリで使用する方法はありますか? – Andrew

+0

注釈を使用してプロファイルを取得するには、http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e3524を使用します。しかし、有効と無効を切り替えるには、em.getDelegate()から取得するSessionオブジェクトにアクセスする必要があります。 – jpkrohling

関連する問題