hibernate get/load/saveOrUpdate/statistics
7805 ワード
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().
添付: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インスタンスを作成する.
例:
(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実装の例.
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;
}