1.永続的なオブジェクトのライフサイクル
アプリケーションがHibernateフレームワークを使用した後、アプリケーションによって作成された永続的なオブジェクトは、完全なライフサイクルを通過してデータベース操作を完了します。これらの3つの状態の遷移は、下の図に示すように、アプリケーションで制御できます。
これらの状態を明確に理解するために、これらの状態のオブジェクト間の違いを表示する例を以下に示します。州内の次のコードは次のとおりです。
(1)Hibernate_Sessionアセンブリを作成し、対応するJARパッケージを追加します。
(2)Hibernateを構成し、対応するエンティティユーザークラスとそのマッピングファイルを追加し、対応するデータベース接続を構成します。
ユーザークラスファイルマッピングファイルuser.hbm.xmlコード:
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapting-3.0.dtd"> <! 3.4.0.cr1-> <hibernate-mapping> <class name = "com.hibernate.user"> <id name = "id"> <generator/> </id> <プロパティ名= "name"/> <プロパティ名= "パスワード="/>
Hibernateデータベース接続構成コード:
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-configuration public " - // hibernate/hibernate構成name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <property name = "hibernate.connection.url"> jdbc:// localhost:3306/hibernate_session </property> <property.connte.connety.connety.connety.connection. name = "hibernate.connection.password"> ab12 </property> <! - 方言:方言、ランタイムと同様のカプセル化された基礎となるAPIは、構成の対応する言語に変換します - > <プロパティname = "hibernate.dialect"> org.hibernate.dialect.dialect.mysqlinect < resource = "com/hibernate/user.hbm.xml"/> </session-factory> </hibernate-configuration>
(3)StaticメンバーSessionFactoryのパブリッククラスを追加して、SessionFactoryとそのセッションオブジェクトを作成します。
パッケージcom.hibernate; org.hibernate.sessionをインポートします。 Import org.hibernate.sessionFactory; Import org.hibernate.cfg.configuration;パブリッククラスセッション{private static sessionfactory Factory; // staticローカル変数SessionFactory、データベースミラーStatic {try {//構成データベースの構成ファイルを作成して取得し、hibernate.cfg.xml configuration cfg = new configuration()。configure(); Factory = CFG.BuildSessionFactory(); //データベースイメージを作成} catch(例外e){e.printstacktrace(); //エラーメッセージを印刷}} public static session getsession(){return factory.opensession(); //作成されたセッションオブジェクトを返します} public static sessionfactory getSessionFactory(){return Factory; //対応するSessionFactoryを返します} //セッションオブジェクトを閉じるpublic static void closessess(session session){if(session!= null){if(session.isopen()){session.close(); }}}}}(4)ソースフォルダーを追加し、フォルダーにcom.hibernateという名前のパッケージを追加し、パッケージにSessionTestという名前のクラスファイルを追加します。
パッケージcom.hibernate; Import Java.util.date; junit.framework.testcaseをインポートします。 org.hibernate.sessionをインポートします。 org.hibernate.transactionをインポートします。パブリッククラスセッションテストはテストケースを拡張します{} 2。状態変換方法
1.オブジェクトは永続的な状態に直接入ります
1.1メソッドを取得します
データベースから情報の行を取得し、作成されたオブジェクトに情報を同期させます。このメソッドはオブジェクトオブジェクトを返し、コンテンツが見つからない場合はnullを返します。次の例では、セッションGETメソッドを使用してオブジェクトを取得し、オブジェクトをインスタンスに変換します。
public void testget1(){session session = null;トランザクションTx = null; try {session = hibernateutils.getSession(); //トランザクションを開くtx = session.begintransaction(); // getによって読み込まれたオブジェクトは永続的なオブジェクトです// execute queryステートメントをすぐに発行し、存在しない場合、null user users session.get(user.class、 "ff80808145bc28cc0145bc28ce020002"); System.out.println(user.getName()); //永続的な状態//永続的な状態変更オブジェクトの変化オブジェクトのプロパティが変更されたとき// hibernateはuser.setname( "zhao liu"); session.getTransaction()。commive(); } catch(Exception e){e.printstacktrace(); if(tx!= null){tx.rollback(); }}最後に{hibernateutils.closessession(session); }}ブレークポイントを設定して、ユーザーオブジェクトを取得します。
このオブジェクトが取得され、キャスト後にユーザーオブジェクトが取得されます。 SetNameメソッドがプログラムに追加されます。つまり、データベースの名前が更新されます。実行が完了すると、結果を更新するために下の図に示すように、データベースがチェックされます。
1.2ロードメソッド
関数はGETメソッドに似ており、データベースからデータも取得し、オブジェクトに同期します。この方法は、怠zyな操作をサポートします。永続的なオブジェクトオブジェクトまたはプロキシを返すため、変換する必要があります。
public void testload1(){session session = null; try {session = hibernateutils.getSession(); //ロードは怠zy(遅延ロード/レイジーロード)をサポートするため、クエリステートメントはすぐにチェックされません。このオブジェクトが真に使用されてから作成された場合にのみ、クエリステートメントが冬眠に対して発行されます。主にパフォーマンスを向上させることです。 Lazyは、Hibernateの非常に重要な機能です。 Hibernateの怠zyはどのように実装されていますか?プロキシオブジェクトによって実装されています。プロキシオブジェクトは、JDKの動的プロキシは、言い訳を実装するクラスのプロキシのみを生成できるため、主にJDKの動的プロキシの代わりにcglibライブラリによって生成された//を使用します。 CGLIBは、クラスの//プロキシを生成できます。継承方法ユーザーユーザー=(user)session.load(user.class、 "8A1B653745BCC7B50145BCC7B7B7B7140001"); System.out.println(user.getName()); //永続的な状態//永続的な状態を持つオブジェクト、オブジェクトのプロパティが変更された場合// hibernateはuser.setname( "zhaoliu"); session.getTransaction()。commive(); } catch(Exception e){e.printstacktrace(); }最後に{hibernateutils.closessession(session); }}下の図に示すように、ユーザーオブジェクトを取得するためのクエリ:
上記の図を分析すると、取得したユーザーオブジェクトは完全ではないか、一般的なユーザーオブジェクトはありませんが、プロキシです。 CGLIBを使用してオブジェクトをプリロードし、オブジェクトを使用するときにのみ本当に作成されます。
1.3 vsロードを取得します
取得とロードのメソッドは非常に重要です。彼らはしばしば、冬眠とのインタビュー中に撮影されます。以下は、次の2つの比較です。
類似点:
(1)関数は同じであり、関係データはオブジェクトに変換されます。
(2)使用方法は同じであり、パラメーターの2つの違いも必要です。
(1)ロードメソッドは、怠zyな操作をサポートし、オブジェクトをプリロードし、使用した場合にのみ作成されます。リレーショナルデータをオブジェクトに直接変換します。
(2)負荷荷重オブジェクトが存在しない場合、ObjectNotFoundExceptionがスローされ、GETがデータを取得しない場合、NULLを返します。
2。分離したオブジェクトを手動で構築します
オブジェクトを取得する別の方法があります。 GETおよびロードメソッドとは異なります。手動の方法です。最初に、オブジェクトは一般的であり、次にオブジェクトのデータがIDを策定することによって取得されます。この方法は次のとおりです。
public void testuer(){session session = null; try {session = hibernateutils.getSession(); session.begintransaction(); // Detached ObjectUser users = new user(); user.setId( "8A1B653745BCC7B50145BCC7B7B7140001"); //永続的な状態//永続的な状態を持つオブジェクト、オブジェクトのプロパティが変更されたとき// hibernateはセッションを同期します。GetTransaction()。キャッシュをクリーニングするときにデータベースでcommit()。 } catch(Exception e){e.printstacktrace(); }最後に{hibernateutils.closessession(session); }}得られた結果図を表示します。
分析結果図は、オブジェクトのID番号を設定するためにコードで使用されます。 ID番号が策定された後、オブジェクトを操作できます。トランザクションが送信された後、データベースに同期され、手動仕様を使用してオブジェクト情報を手動で指定します。
2.1メソッドを削除します
データベースで指定されたオブジェクトを削除するには、オブジェクトを削除する前に永続的な状態に変換する必要があります。 GET、ロード、または手動メソッドを使用して、オブジェクトを指定できます。この方法は次のとおりです。
session = hibernateutils.getSession(); session.begintransaction();ユーザーユーザー=(user)session.load(user.class、 "8a1b653745bcc6d50145bcc6d67a0001"); //このメソッドを使用して、最初に削除、ロードし、次にsession.delete(user)を削除することをお勧めします。
2.2アップデート
データを更新すると、このメソッドはデータベースのデータを変更します。それを使用すると、数量に状況があり、データベース内の特定のフィールドの値を更新するか、データベースの行全体を更新します。
2.2.1フィールド値を更新します
特定のフィールドの値のみを更新する場合、更新する前に、ロードを使用するか、次のようにオブジェクトを永続的なステータスコードに変換する必要があります。
//セッションオブジェクトセッションを取得= hibernateutils.getSession(); //トランザクションsession.begintransaction()を開きます。 //または別の方法を使用して//session.getTransaction()。begin(); //ユーザーオブジェクトを取得するためにロード//方法2:ユーザーユーザーを手動で取得= new user(); user.setId( "8A1B653745BCC7B50145BCC7B7B7140001"); //名前user.setname( "zhangsan")を更新します。 session.update(user); session.getTransaction()。commive();
2.2.2行全体を更新<BR />行全体のデータを更新する場合は、状態を手動で分離状態に変換し、オブジェクトのID値を手動で指定できます。コードは次のとおりです。
//セッションオブジェクトセッションを取得= hibernateutils.getSession(); //トランザクションsession.begintransaction()を開きます。 //別の方法を使用して//session.getTransaction()。begin(); //ユーザーを手動で取得しますuser = new user(); user.setId( "8A1B653745BCC7B50145BCC7B7B7140001"); //名前user.setname( "zhangsan")を更新します。 session.update(user); session.getTransaction()。commive();
更新結果を表示:
更新の結果を分析すると、実際にデータベースのデータ全体が更新されます。この更新操作には不確実性が多すぎて、使用することはお勧めしません。
2.3メソッドを保存します
データを挿入します。保存メソッドを実行すると、データベース挿入ステートメントが呼び出され、データベースに新しい行が追加されます。保存されたオブジェクトは、永続的な状態に変換されます。この状態では、オブジェクトはオブジェクトを再度更新でき、トランザクションが最終的に送信されたときに変更を加えてデータベースに更新されます。次のように:
public void testsave2(){session session = null;トランザクションTx = null; try {session = hibernateutils.getSession(); //トランザクションを開くtx = session.begintransaction(); // Transient Statusユーザー= new user(); user.setname( "zhangsi"); user.setPassWord( "123"); user.setcreatetime(new date()); user.setexpiretime(new date()); //永続的な状態//永続的な状態が変更されたオブジェクトオブジェクトのプロパティが変更されたとき// hibernateはsession.save(user)を同期します。 user.setname( "lisi"); tx.commit(); } catch(Exception e){e.printstacktrace(); if(tx!= null){tx.rollback(); }}最後に{hibernateutils.closessession(session); } //デタッチされたステータス}前の例を表示する結果ビュー:
分析結果:セッションは実際にトランザクションを送信するときに2つの操作を行います。コード内の更新プロセスと組み合わせると、まず新しいユーザーオブジェクトが追加され、保存操作が実行されます。挿入ステートメントを呼び出し、セット名操作がコードで実行され、名前が再修正されます。ただし、現時点ではデータベースに同期されていませんが、メモリにあります。現時点では、2つの州があります。この時点でのデータビットは汚れたデータであり、最終的にトランザクションを送信するときにデータベースに更新されると言います。