検索
ホームページバックエンド開発PHPチュートリアルHibernate_PHP チュートリアルでの 3 種類の遅延ロード

Hibernate_PHP チュートリアルでの 3 種類の遅延ロード

Jul 13, 2016 pm 05:53 PM
hibernate関係負荷同期する物体遅れ確立する永続的なデータベース記録

永続性: オブジェクトはデータベース レコードとの対応関係を確立し、同期を維持します。オブジェクトは永続コンテキストにバインドされており、将来の状態変更やデータ変更はワークユニットの管理下にあります。これが永続状態です。 Session.load は Hibernate3.2 で提供されるデフォルトの遅延ロードメソッドで、ロードされるのはプロキシであり、永続的な状態とも言えます。
遅延ロード メカニズムは、不要なパフォーマンスのオーバーヘッドを回避するために提案されています。いわゆる遅延ロードとは、データが実際に必要なときにデータ ロード操作が実際に実行されることを意味します。遅延ロードを使用する場合、使用されるオブジェクトは、プロキシ オブジェクトのすべてのメンバー変数とメソッドを含むプロキシ オブジェクトです。ただし、このオブジェクトでは、メンバー変数の値は NULL であり、Hibernate は 1 組のエンティティを提供します。さらに、Hibernate3 はプロパティの遅延ロードも提供します。以下では、これらのタイプの遅延読み込みの詳細をそれぞれ紹介します。
A. エンティティ オブジェクトの遅延読み込み:
エンティティ オブジェクトに遅延読み込みを使用する場合は、以下に示すように、エンティティのマッピング構成ファイルで対応する構成を構成する必要があります。


                                                                                                
クラスの遅延属性を true に設定すると、エンティティの遅延読み込み機能をオンにできます。次のコードを実行すると:
ユーザー user=(ユーザー)session.load(ユーザー.クラス,”1”);(1)
System.out.println(user.getName()); (2)
(1) を実行する場合、Hibernate はデータのクエリを開始しません。一部のデバッグ ツール (JBuilder2005 のデバッグ ツールなど) を使用するか、デバッグ ブレークポイント監視を使用すると、この時点でユーザー オブジェクトのメモリ スナップショットが取得されます。この時点で返されるのが User$EnhancerByCGLIB$$bede8986 型のオブジェクトである可能性があり、その属性が null であることに驚くでしょう。 session.load() メソッドは、エンティティ オブジェクトのプロキシ クラス オブジェクトを返します。ここで返されるオブジェクト タイプは、User オブジェクトのプロキシ クラス オブジェクトです。 Hibernate では、CGLIB を使用してターゲット オブジェクトのプロキシ クラス オブジェクトを動的に構築します。プロキシ クラス オブジェクトにはターゲット オブジェクトのすべてのプロパティとメソッドが含まれており、すべてのプロパティには null が割り当てられます。デバッガによって表示されたメモリ スナップショットから、この時点で実際の User オブジェクトがプロキシ オブジェクト
の CGLIB$CALBACK_0.target 属性に含まれていることがわかります。 (2)までのコードが実行されると、user.getName()メソッドが呼び出されます。このとき、CGLIBが提供するコールバック機構を通じて、実際にはCGLIB$CALBACK_0.getName()メソッドが呼び出されます。 Hibernate はまず CGLIB$CALBACK_0.target 属性が null かどうかを確認し、null でない場合はターゲット オブジェクトの getName メソッドを呼び出し、次のような SQL ステートメントを生成します。 select * from user where id='1 '; データをクエリし、ターゲット オブジェクトを構築し、それを CGLIB$CALBACK_0.target 属性に割り当てます。このように、中間プロキシ オブジェクトを通じて、Hibernate はエンティティの遅延読み込みを実装します。ユーザーが実際にエンティティ オブジェクトの属性を取得するアクションを開始した場合にのみ、データベース クエリ操作が実際に開始されます。したがって、エンティティの遅延ロードは中間プロキシ クラスを通じて完了するため、エンティティの遅延ロードを使用するのは session.load() メソッドのみです。これは、 session.load() メソッドのみがエンティティのプロキシ クラス オブジェクトを返すためです。クラス。
B. コレクション型の遅延読み込み:
Hibernate の遅延ロード メカニズムの中で、コレクション型の適用はパフォーマンスを大幅に向上させることができるため、最も重要です。この目的のために、Hibernate は JDK コレクションを 1 対 1 で独立して実装するなど、多くの努力を行ってきました。多くの関係では、関連付けられたオブジェクトに対応するために定義する Set コレクションは、java.util.Set 型またはそのサブタイプではなく、カスタム コレクション クラスの実装を使用して net.sf.hibernate.collection.Set 型になります。コレクション型の遅延読み込み。コレクション型に遅延読み込みを使用するには、エンティティ クラスの関連付け部分を次のように構成する必要があります:




で < One-many class =” com.neusoft.entity.arrderss”/>
セット>
クラス>

要素の遅延属性を true に設定して、コレクション型の遅延読み込み機能をオンにします。以下のコードを見てみましょう:
ユーザー user=(User)session.load(User.class,”1”);
コレクション addset=user.getAddresses() (1)
イテレータ it=addset.iterator() (2)
while(it.hasNext()){
アドレス address=(アドレス)it.next();
System.out.println(address.getAddress());
}
プログラムが (1) まで実行されると、関連データをロードするためのクエリは開始されません。(2) まで実行されると、この時点で Hibernate が開始されます。キャッシュ内の修飾データ インデックスを使用して、修飾エンティティ オブジェクトを検索します。ここでは、新しい概念であるデータ インデックスを紹介します。次に、まずデータ インデックスとは何かを見ていきます。 Hibernate でコレクション タイプをキャッシュする場合、コレクション タイプは 2 つの部分に分けてキャッシュされます。まず、コレクション内のすべてのエンティティの ID リストがキャッシュされ、次に、これらのエンティティ オブジェクトの ID リストがキャッシュされます。索引。データ インデックスを検索するときに、対応するデータ インデックスが見つからない場合は、選択 SQL が実行されて修飾されたデータが取得され、エンティティ オブジェクトのコレクションとデータ インデックスが構築され、エンティティ オブジェクトのコレクションが返されて、エンティティが追加されます。オブジェクトとデータのインデックスを Hibernate のキャッシュに追加します。一方、対応するデータインデックスが見つかった場合は、データインデックスから id リストを取り出し、その id に基づいてキャッシュ内で対応するエンティティを検索し、見つかった場合はキャッシュから返します。見つからない場合は、選択 SQL クエリが開始されます。ここでは、パフォーマンスに影響を与える可能性のある別の問題、それがコレクション型のキャッシュ戦略であることがわかります。コレクションタイプを次のように構成すると:
                                                                                             
…..




セット>
クラス>

ここで、 設定を適用すると、Hibernate はデータ インデックスのみをキャッシュし、コレクション内のエンティティ オブジェクトはキャッシュしません。上記の構成に従って、次のコードを実行します:
ユーザー user=(User)session.load(User.class,”1”);
コレクションはaddset=user.getAddresses(); イテレーター it=addset.iterator(); while(it.hasNext()){
アドレス address=(アドレス)it.next();
System.out.println(address.getAddress());
}
System.out.println(“2番目のクエリ……”);
ユーザー user2=(ユーザー)session.load(ユーザー.クラス,”1”);
コレクション it2=user2.getAddresses();
while(it2.hasNext()){
アドレス address2=(アドレス)it2.next();
System.out.println(address2.getAddress());
}
このコードを実行すると、次のような出力が得られます:
id='1';のユーザーから*を選択してください
user_id='1';のアドレスから*を選択してください
天津
大連
2番目のクエリ……
id='1';のアドレスから * を選択してください
id='2';のアドレスから*を選択してください
天津
大連
クエリが 2 回目に実行されると、アドレス テーブルに対して 2 つのクエリ操作が実行されることがわかります。これはなぜでしょうか。これは、エンティティが初めてロードされるとき、コレクション タイプのキャッシュ戦略の構成に従って、コレクション データ インデックスのみがキャッシュされ、コレクション内のエンティティ オブジェクトはキャッシュされないためです。もう一度、Hibernate は対応するエンティティのデータ インデックスを見つけましたが、データ インデックスによると、キャッシュ内で対応するエンティティを見つけることができなかったため、Hibernate は見つかったデータ インデックスに基づいて 2 つの選択 SQL クエリ操作を開始しました。パフォーマンスの無駄が発生しました。この状況を回避するにはどうすればよいでしょうか?コレクション タイプのエンティティのキ​​ャッシュ戦略も指定する必要があるため、コレクション タイプを次のように構成する必要があります:


…..




セット>
                                                                         
この時点で、Hibernate はコレクション タイプのエンティティもキャッシュします。この設定に従って上記のコードを再度実行すると、次のような出力が得られます。 id='1';のユーザーから*を選択してください
user_id='1';のアドレスから*を選択してください
天津
大連
2番目のクエリ……
天津
大連
現時点では、コレクション型に格納されているエンティティ オブジェクトはキャッシュから直接取得できるため、データ インデックスに基づいてクエリを実行する SQL ステートメントはこれ以上ありません。
C. 属性の遅延読み込み:
Hibernate3 では、属性の遅延読み込みという新機能が導入され、高パフォーマンスのクエリを取得するための強力なツールが提供されます。先ほどビッグ データ オブジェクトの読み取りについて説明しましたが、User オブジェクトには履歴書フィールドがあります。このフィールドは java.sql.Clob タイプであり、オブジェクトをロードするときに毎回ロードする必要があります。このフィールドは、本当に必要かどうかに関係なくロードする必要があり、この大きなデータ オブジェクト自体を読み取ると、パフォーマンスに多大なオーバーヘッドが生じます。 Hibernate2 では、前に述べたように、パフォーマンスを細分化して User クラスを分解することによってのみこの問題を解決できます (そのセクションの説明を参照してください)。しかし Hibernate3 では、属性の遅延読み込みメカニズムを使用できるため、このフィールドを操作する必要がある場合にのみ、このフィールドのデータを読み取る機能を取得できるため、エンティティ クラスを次のように構成する必要があります。

……

クラス>

Hibernate3 でプロパティの遅延ロードを実装するには、クラス エンハンサーを使用してエンティティ クラスの Class ファイルを拡張します。エンハンサーでは、CGLIB のコールバック メカニズム ロジックをエンティティ クラスに追加します。ここでは、属性の遅延読み込みが依然として CGLIB を通じて実装されていることがわかります。 CGLIB は Apache のオープンソース プロジェクトであり、このクラス ライブラリは Java クラスのバイトコードを操作し、バイトコードに基づいて要件を満たすクラス オブジェクトを動的に構築できます。上記の設定に基づいて、次のコードを実行します:
文字列 sql=”from ユーザー user where user.name=’zx’ ”;
クエリクエリ=session.createQuery(sql); (1)
リスト list=query.list();
for(int i=0;i ユーザー user=(User)list.get(i);
System.out.println(user.getName());
System.out.println(user.getResume()); (2)
}
実行が (1) に達すると、次のような SQL ステートメントが生成されます:
name=’zx’;www.2cto.com
のユーザーからID、年齢、名前を選択してくださいこのとき、Hibernate は User エンティティ内のすべての非遅延読み込み属性に対応するフィールド データを取得します。実行が (2) に達すると、次のような SQL ステートメントが生成されます。 id='1';のユーザーから履歴書を選択してください
このとき、実際のレジュームフィールドデータの読み出し動作が開始される。
著者: oh_モウリーニョ

http://www.bkjia.com/PHPjc/478064.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478064.html技術記事永続性: オブジェクトはデータベース レコードとの対応関係を確立し、同期を維持します。オブジェクトは永続化コンテキストにバインドされており、将来の状態の変更とデータの変更は作業単位内で行われます...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの継続的な使用:その持久力の理由PHPの継続的な使用:その持久力の理由Apr 19, 2025 am 12:23 AM

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPおよびPython:類似点と相違点を調査しますPHPおよびPython:類似点と相違点を調査しますApr 19, 2025 am 12:21 AM

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPとPythonの選択:ガイドPHPとPythonの選択:ガイドApr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPとフレームワーク:言語の近代化PHPとフレームワーク:言語の近代化Apr 18, 2025 am 12:14 AM

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

PHPの影響:Web開発などPHPの影響:Web開発などApr 18, 2025 am 12:10 AM

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール