hibernate get/load/saveOrUpdate/statistics


hibernateでのgetとloadの違い:
(1)loadメソッド,hibernateは,このidに対応するオブジェクト(データベースレコード)がデータベースに必ず存在すると考え,オブジェクトに用いられる
他の属性データの場合のみデータベースを問合せますが、万が一データベースにそのレコードが存在しない場合は、ObjectNotFoundEcception異常のみを投げ出すことができます.
「loadメソッド放出異常」とは、オブジェクトのデータを使用する場合、データベースにデータが存在しない場合に放出異常を意味し、これを作成するのではなく、
個のオブジェクトの場合.セッション中のキャッシュはhibernateにとってかなり安価なリソースなので、load時に調べておきます
セッションキャッシュは、idに対応するオブジェクトが存在するかどうかを確認し、存在しない場合はエージェントを作成します.IDがデータベースにあることを知っていれば
対応するレコードが存在する場合、loadメソッドを使用して遅延ロードを実現することができる.
 
(2)getメソッド,hibernateは,idに対応するデータが存在するかどうかを確認し,まずsessionキャッシュで検索し,その後2次緩和する.
保存中に検索し、まだデータベースを調べずにnullを返します.
 
動的変更データのロード:
プロファイルにはlazy=true、プログラムには強制的にロードする方法があります.initialize(Object
Proxy)メソッドの強制ロードは、lazy=falseに動的に変更することに相当します.注意すべき点は、proxyは永続オブジェクトの関連オブジェクト属性です.例えば、Aエンティティは、Aの関数を
連結エンティティBもチェックアウトする場合はHibernateと書く.initialize(a.b).
 
付:Hibernate synchronizerがoracleをマッピングする時、駆動とURL、ユーザー名、パスワードはすべてすでに記入して、Refreshの時、出てくる表はシステムの中のすべての表で、ユーザーがいる表空間のユーザー表ではありませんて、Schema Patternの中で大文字のユーザー名を書いて、濾過を実現します.
 
HibernateがMyEclipseを介してoracleデータベース接続を確立する場合、次のエラーが報告されます.java.sql.SQLException:ORA-00604:error occurred at recursive SQL level 1 ORA-12705:invalid or unknown NLS parameter value specifiedは駆動の問題です.
 
hibernate.hbm2ddl.auto
 
validateがhibernateをロードすると、データベーステーブル構造createを作成するたびにhibernateをロードし、データベーステーブル構造を再作成することを検証します.これが、データベーステーブルデータの損失の原因です.create-drop hibernateのロード時に作成し、終了はテーブル構造を削除するupdate hibernateのロードhibernate自動更新データベース構造
 
HibernateのsaveOrUpdateメソッド
 
hibernateはsaveOrUpdateの方法を提供してデータベースの操作を行います.hibernateは、オブジェクトのステータスに応じてinsertかupdateかを決定します.xmlファイルのunsaved-valueによって根本的に決定されます(デフォルトはnull).nullを設定すると、システムは受信したオブジェクトのidの値に基づいて判断し、nullであればオブジェクトが存在しないことを示すinsert;Nullでない場合は既に存在することを示す、update.noneに設定すると、オブジェクトが存在しないことを示し、insertが常に呼び出されます.anyに設定すると、オブジェクトが常に存在することを示し、updateが常に呼び出されます.
 
説明:デフォルトunsaved-value=「null」では、hibernateはプライマリ・キーに基づいてselectを生成し、このオブジェクトが永続化されているかどうか、永続化されているかどうかupdate、永続化されていないsaveを判断します.プライマリ・キー生成ポリシーがassignedの場合、IDが重複している場合はエラーが発生せず、既存のデータが更新されます.
 
データベース・テーブルのプライマリ・キー
 
Generatorは、POJOのインスタンスごとに一意の識別を提供します.一般的には「native」を使用します.classはジェネレータインタフェースnetを用いることを示す.sf.hibernate.id.IdentifiierGenerator実装の例.
  • 「assigned」プライマリ・キーは外部プログラムが作成し、save()の前に1つ指定する.
  • 「hilo」hi/loアルゴリズムによるプライマリ・キー生成メカニズムでは、追加のデータベース・テーブルまたはフィールドに上位値ソースを提供する必要がある.
  • 「seqhilo」はhiloと類似しており、hi/loアルゴリズムによるプライマリ・キー生成メカニズムは、OracleなどのSequenceをサポートするデータベースに適用されるデータベース内のSequenceが必要である.
  • 「increment」キーは数値順に増加します.このような実装メカニズムは、現在の適用例で変数を維持して現在の最大値を保存し、その後、プライマリ・キーを生成する必要があるたびにこの値に1をプライマリ・キーとして加算することである.この方法で発生する可能性のある問題は、クラスタの下で使用できないことです.
  • 「identity」は、データベースが提供するプライマリ・キー生成メカニズムを採用している.DB 2、SQL Server、MySQLのプライマリ・キー生成メカニズムなどです.
  • 「sequence」は、データベースが提供するsequenceメカニズムを用いてプライマリ・キーを生成する.OralceのSequenceのように.
  • 「native」は、Hibernateが使用するデータベースに基づいてidentity、hilo、sequenceのいずれかをプライマリキーとして生成する方式を採用していると判断する.
  • 「uuid.hex」は、Hibernateが128ビットUUIDアルゴリズムに基づいて16進数(符号化後は長さ32の文字列で示す)をプライマリキーとして生成する.
  • 「uuid.string」とuuid.Hexは似ていますが、生成されたプライマリ・キーが符号化されていない(長さ16)だけで、PostgreSQLデータベースには適用できません.
  • 「foreign」は、別の関連するオブジェクトの識別子をプライマリ・キーとして使用する.

  • Hibernate統計関数
     
    Hibernate 3.0からx/3.1.xが最新の3.2版にアップグレードされた後、3.2版の多くのsql関数、例えばcount()はsum()の唯一の戻り値がIntegerからLongに変わり、コードをアップグレードしなければClassCastExceptionが得られる.この変化は主にJPAと互換性があるため、hibernate.orgの最新ドキュメントに説明が見つかりました.次のようになります.
    count = ((Integer)iter.next()).intValue(); これでClassCastExceptionに報告されます.これに変更すればいい、count=(Number)iter.next()).intValue().
     
       
    public int getTotalCount(String hql) {   
        int count=0;       
        String countStr = "select count(*) "+ hql;         
        List list = findHelper(countStr);   
        Iterator iter = list.iterator();   
        if(iter.hasNext()){   
            count = ((Number)iter.next()).intValue();   
        }   
        return count;   
    }  

     
    添付:org.hibernateパッケージには、次の3つのペアに役立つインタフェースがあります.
    1、Interface ScrollableResultsこのインタフェースはJDBCのResultSetのように、結果セットを返す遍歴とフィールドへのアクセス方法を提供します.例えば、public boolean next()カーソル後移動public boolean previous()カーソル前移動public boolean scroll(int i)カーソル指定不明public void beforeFirst()カーソル先頭記録前public void afterLast()カーソル末記録後publicObject[]get()現在記録されているフィールド値をObjectオブジェクト配列としてpublicObjectget(int i)現在記録されている特定フィールド値をObjectオブジェクトとしてpublicIntegergetInteger(int col)現在記録されている特定フィールド値をIntegerオブジェクトとしてpublicLonggetLong(int col)に戻す現在レコードの特定フィールド値をLongオブジェクトでpublicStringgetText(int col)現在レコードの特定フィールド値をTextオブジェクトでpublicStringgetString(int col)現在レコードの特定フィールド値をStringオブジェクトで返す…2、Interface Queryインタフェースはデータベースに対するクエリーなどの操作をカプセル化している.ここでは、scroll()メソッドがScrollableResultsインスタンスを返すことができるからである.publicScrollableResultsscroll()はクエリー結果をScrollableResultsインスタンスで返すが、クエリーが返す結果は実際にはidにすぎないことに注意しなければならない.必要に応じて(たとえば、ScrolableResults.next()メソッドを使用してカーソルを後方に移動する場合)この必要なレコードが本当に初期化されます.
    3、Interface Session SessionはHibernateの核心の中の核心で、SessionのcreateQuery()方法を通じて、私達は1つのQueryの実例を生成することができます:public
    QuerycreateQuery(StringqueryString)は、与えられたHQLクエリ列でQueryインスタンスを作成する.
     
    例:
    public List statTotalCharge(Date statTimeBegin, Date statTimeEnd) throws DaoException{
            List res = new Vector();//            
            Session session = null;
            ScrollableResults srs = null;
            try{
                session = HibernateSessionFactory.openSession();//    Hibernate Session
                //        Query       scroll()     ScrollableResults         
                srs = session.createQuery(“select b.name, count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from charge a, customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >= ? and a.chargeEndTime < ? gourp by a.idCustomer“).setDate(0, statTimeBegin).setDate(1, statTimeEnd).scroll();
                //       List  
                while(srs.next()){
                    res.add(new TotalCharge(srs.getString(0), srs,getDouble(1), srs.getDate(2), srs.getDate(3)));
                }
            }catch(HibernateException he){
                    if(srs!=null){
                    try{
                        srs.close();
                    }catch(Exception e){
                        ;
                    }
                }
            }finally{
                try{
                    session.close();
                }catch(Exception e){
                    ;
                }
            }
            return res;
        }