2011-12-27 6 views
2

loadが呼び出されると、Hibernateはオブジェクトがすでにセッションに含まれているかどうかをチェックします。これが真の場合、オブジェクトが返されます。そうでない場合、プロキシが作成されます。休止状態でセッションを理解できない

セッションは、データベースとやり取りするためのもので、オブジェクトをロードメソッドで渡すときにオブジェクトをどのように格納しているかを示します。次に、使用されるプロキシについてはどうでしょうか。

+0

セッションは、パフォーマンス上の理由から、第1レベルのキャッシュ(メモリ内)です。 CGLIBプロキシは、エンティティ/コレクションの遅延読み込みを容易にするために作成されます。 – aishwarya

答えて

1

プロキシは、実際のオブジェクトを囲む単なるエンベロープです。 session.load(Person.class, 3)を呼び出すと、HibernateはID 3のPersonがセッションキャッシュにすでに存在するかどうかをチェックします。そうでなければ、プロキシを作成し、それをセッションキャッシュに格納して返します。プロキシは次のように動作するクラスです:

public class PersonProxy extends Person { 
    private int id; 
    private boolean initialized = false; 

    public String getName() { 
     if (!initialized) { 
      // read state of the entity from database; 
      initialized = true; 
     } 
     return this.name; 
    } 

    ... 
} 
+0

セッションが終了すると、第1レベルのキャッシュ全体がクリアされますか? –

+0

はい。第1レベルのキャッシュは、セッションによって維持される。セッションを閉じると、その第1レベルのキャッシュはクリアされます。 –

+0

別のスレッドがセッションを開いている場合は、プロキシは利用可能かどうか?パフォーマンス上の問題がどこにないのか?ID 3セッションのユーザーが閉じていない場合は、アプリケーション全体で利用できますか? –