ヒベルナ耐久層の状態とその特徴


持続可能なJavaオブジェクトが必要な場合、そのライフサイクルにおいては、以下の3つの状態のうちの1つにあることができる.
(1)一時状態(tranient):new文で作成したばかりで、まだ持続化されていません.Sessionのキャッシュにはありません.一時的な状態にあるJavaオブジェクトは、一時的なオブジェクトと呼ばれる.アプリケーションがnew文でオブジェクトを作成すると、このオブジェクトのライフサイクルが開始されます.このオブジェクトが一時的な状態にあるとき、すなわちこのオブジェクトは一時的なデータを保存するメモリ領域だけです.変数がなければ、このオブジェクトを参照してください.
このオブジェクトはライフサイクルを終了すると、jreのゴミ回収メカニズムによって回収されます.このオブジェクトが保存しているデータはデータベースとは関係がありません.SessionのsaveまたはSaveOrUpdateを通じて一時的なオブジェクトをデータベースに関連づけて、データを挿入したり、データベースに更新したりしない限り、このオブジェクトは永続的なオブジェクトに変換されます.
    たとえば:
Emp e=new Emp();    //      
e.setEmpno((long) 8888);
e.setEName("mike");
...
EmpDAO d=new EmpDAO();
d.save(e);      //   
...
(2)持続状態(persistent):すでに持続化され、Sessionのキャッシュに加入する.恒久化状態にあるJavaオブジェクトは恒久化対象と呼ばれる.恒久化オブジェクトの例は、データベースに対応するレコードがあり、恒久化された表現(ID)を有する.耐久化対象に対してdelete操作を行うと、データベースに対応するレコードが削除されます.耐久化対象とデータベースレコードは対応関係がなくなり、永続化対象は一時的な状態になります.恒久化対象が変更されたら、すぐにデータベースに同期しないで、データベース事務の提出を知っています.同期前には,耐久化対象は汚い(Dirty)であった.
    たとえば:
          Emp e=new Emp(); //        
          EmpDAO edao= new empDAO();
          e=edao.findbyEmpno((long) 7786);    //           ,     
          e.setEname("    ");                     //        ,     Dirty
          ......
          edao.saveorupdate(e);                      //  ,     Dirty
          tran.commit();                                     //  ,        ,  Dirty
          ......
 
(3)遊離状態(detached):すでに持続化されているが、Sessionのキャッシュにはない.遊離状態にあるJavaオブジェクトは遊離オブジェクトと呼ばれる.SessionがClose、Clearまたはevictを行った後、持続化対象は、耐久化識別子とデータベースに対応した記録との一致値を持っているが、セッションはすでに消えているので、オブジェクトは恒久化管理内にないので、フリー状態にある.遊離状態のオブジェクトは一時的な状態のオブジェクトと非常に似ていますが、永続的な表示も含まれています.
耐久化状態の対象は、POで一時的な状態と遊離状態の対象と略称される:VO
Javaオブジェクトの状態変換:Sessionの特定の方法は、Javaオブジェクトを状態から別の状態に変換することをトリガする.Javaオブジェクトが一時的な状態または遊離状態にある場合、変数によって参照されない限り、ライフサイクルが終了し、そのメモリをJVMのゴミ回収器で回収することができます.持続的な状態にあるとき、Sessionのキャッシュはそれを参照するので、常にライフサイクルの中にあります.
以下は三つの状態の特徴です.
一時的なオブジェクトは、(1)Sessionのキャッシュにないという特徴があり、いずれのSessionのインスタンスにも関連しないと言ってもよい.(2)データベースには対応するレコードがありません.
以下の場合、Javaオブジェクトは一時的な状態に入ります.(1)new文を通じてJavaオブジェクトを作成したばかりの場合、一時的な状態にあり、データベース内のどの記録にも対応しません.(2)Sessionのdelete()方法は、耐久性オブジェクトまたはフリーオブジェクトを一時的なオブジェクトに変換することができる.遊離オブジェクトに対して、delete()メソッドはデータベースからそれに対応するレコードを削除する.永続化オブジェクトに対しては、Delete()メソッドは、データベースからそれに対応するレコードを削除し、Sessionのキャッシュから削除する.
永続化オブジェクトは、(1)Sessionのインスタンスのキャッシュにあるという特徴があり、永続化オブジェクトは常に1つのSessionのインスタンスに関連しているとも言える.(2)恒久化オブジェクトとデータベース内の関連記録が対応しています.(3)Sessionはキャッシュを整理する時、耐久化対象の属性によって変化し、データベースを同期して更新します.
Sessionの多くの方法は、Javaオブジェクトが持続化状態に入ることをトリガすることができる.(1)Sessionのsave()方法は、一時的なオブジェクトを永続化オブジェクトに変換する.(2)Sessionのロード()またはget()方法で返されるオブジェクトは、常に持続的な状態にある.(3)Sessionのfind()方法で戻ってくるListセットに格納されるのは、耐久性のあるオブジェクトである.(4)Sessionのudate()、saveOrUpdate()とロック()の方法は、遊離対象を永続化対象に変えます.(nate注:hibernate referenceによると、udateで恒久化対象を更新しようとすると投げられます)(5)恒久化対象が一時的なオブジェクトに関連して、カスケード保存が許可された場合、Sessionはキャッシュを消去する際に、この一時的なオブジェクトを恒久化対象に変更します.
遊離オブジェクトは、(1)Sessionのキャッシュにはないという特徴があり、遊離オブジェクトはSessionに関連付けられていないとも言える.(2)フリーオブジェクトは、耐久化対象から移行してきたため、データベースには、それに対応する記録が存在する可能性がある(前提条件は、他のプログラムがこの記録を削除したことがない).
遊離オブジェクトは、一時的なオブジェクトと同じで、両者はSessionに関連付けられていないので、Hibernateは、それらの属性変化がデータベースと同期していることを保証しない.フリーオブジェクトと一時的なオブジェクトの違いは、前者が永続化オブジェクトから変化してきたため、データベースにはまだ対応するレコードがあり、後者はデータベースには対応するレコードがないということです.
Sessionの以下の方法は、耐久性オブジェクトをフリーオブジェクトに変換する.(1)Sessionのclose()メソッドを呼び出すと、Sessionのキャッシュは空になり、キャッシュ中の耐久性オブジェクトはすべてフリーオブジェクトになる.アプリケーションでこれらのオブジェクトを参照しないと、ライフサイクルが終了します.(2)Sessionのevict()メソッドは、キャッシュから永続化されたオブジェクトを削除して、遊離状態にすることができる.Sessionのキャッシュに大量の耐久性オブジェクトが保存されると、多くのメモリ空間が消費され、性能を向上させるために、evict()メソッドを呼び出すことが考えられ、キャッシュからいくつかの耐久性オブジェクトが削除されます.しかし、多くの場合、evict()方法は推奨されず、言語を調べたり、明示的なナビゲーションを通じてオブジェクト図の深さを制御すべきである.