あなたが知っているどのくらいの遅延ロードとキャッシュピットを休止状態?これらの5つの簡単な質問には、私が休止状態と答えないと言うことはできません

 質問1:session.flush()呼び出しが、その効果にも遅延読み込み、それをした後?

あなたが有効にならない場合は、例外や無応答を投げ、または直接、nullを返しますか?

答え:有効にします。それは一度だけ、遅延ロード同じセッションで理解することができます。

 

質問2:複数の通話エンティティクラスのナビゲーションプロパティは、SQLクエリを複数回になりますか?

その後session.flush()を呼び出すと?

答え:ないSQLクエリを複数回、でもsession.flush後。

 

質問3:エンティティ新しく作成したクラスのオブジェクト、()session.flushを呼び出すときに、直接ナビゲーションプロパティをロードすることができますか?

例えば、以下のコードかどうか、直接データベースからロールオブジェクトのroleIdのIDか?

ユーザのユーザ= 新しいユーザー(......)。
user.setRoleId(roleId)。
db.save(ユーザ)。
。db.getSession()フラッシュ(); 
役割の役割 = user.getRole();

 答え:いいえ。

 

質問4:session.get複数のコール(SerializableのID)は、データベースからすべてのクエリウィル? 

 

回答:いいえ、ちょうどキャッシュから読み出され、毎回返されていないが、同じオブジェクトであることが判明しました!同じメモリアドレスああことに注意してください!

 

質問5:あなたは同じエンティティクラス(@Entityノートプラス)のIDあなたが同じメモリオブジェクトに戻るたびに、知っていますか?

図は、これがよりよく理解され、3回のSQLの合計を実施し、理解することは困難である:3従業員は、同じオブジェクトと完全に同一である同じメモリアドレス参照、上に実際にあります!例えば、私は名前も本当にTM驚くべき、変更employee2のでemployee1名は、変更入れて!

 

同じオブジェクトの内部3人の従業員のフィギュアので、我々は、Employeeクラスの@Entityノート、注釈の追加、これはハッシュコードの値を変更しますので、それがあることを推測することができます。クエリはDTOオブジェクトを返す場合ではないオブジェクトは右、異なるすべきですか?この仮説を検証するために彼の方法で、以下の図を参照してください。

この図は示しています。それを推測しました。

 

 

2番目の従業員がデータベースから発見された場合でも、それは最初の従業員メモリオブジェクトと同じであるので、それはですので、name属性は、メモリ内の値の名前に変更されました:図は示しています。それの魔法!

 

遅延ロードの陥没穴を休止:ManyToOneノートについては、実際にデフォルトすることはFetchType.EAGERです

EAGERそれは何を意味するのでしょうか?たとえば、Userクラスは(またはクエリに参加)role属性、ユーザーがオブジェクトをロードするとき、オブジェクトはつまり、あなたが唯一のユーザーテーブルから単純なSQLクエリが、2つのSQLの実装を期待して、同じ時間役割にロードされますがあります。

そのため、通常はManyToOneコメントのために、あなたは、手動でフェッチ= FetchType.LAZYを設定する必要がありそうでない場合は、重大なパフォーマンスの問題があるでしょう。

 

本明細書で試験フレームのJFrameから

春のMVC上に構築されたマルチレベルマルチモジュールのJava Webアプリケーションフレームワーク。インクルード:標準、マルチレベルの例外キャッチ、AJAX標準仕様、マスターページの規範、規範的なビュー示す、JavaScriptフレームワークの規範をログに記録するインフラストラクチャ層、データベース定義の仕様、標準化されたデータベースへのアクセスを、。使用列挙クラス、日時/ BOOL /文字列フィールド仕様、1,1の複数のため、複数対の、多くのマッピング仕様外部キー関係に多くの、:そのようなデータベース定義膜などのフレームワークを、定義された非常に詳細な仕様実際親クラス定義の仕様、仕様のコメント欄、及びその遅延ロード仕様。

 

技術交流QQグループ:651 499 479、助けるために歓迎のJava偉大な神、そしてまた、グループ学習への新規参入を歓迎します。

 

githubの住所:  https://github.com/leotsai/jframe

 

終わり。

オリジナル住所ます。https://www.cnblogs.com/leotsai/p/five-questions-about-hibernate-cache-and-lazy-load.html

 質問1:session.flush()呼び出しが、その効果にも遅延読み込み、それをした後?

あなたが有効にならない場合は、例外や無応答を投げ、または直接、nullを返しますか?

答え:有効にします。それは一度だけ、遅延ロード同じセッションで理解することができます。

 

質問2:複数の通話エンティティクラスのナビゲーションプロパティは、SQLクエリを複数回になりますか?

その後session.flush()を呼び出すと?

答え:ないSQLクエリを複数回、でもsession.flush後。

 

質問3:エンティティ新しく作成したクラスのオブジェクト、()session.flushを呼び出すときに、直接ナビゲーションプロパティをロードすることができますか?

例えば、以下のコードかどうか、直接データベースからロールオブジェクトのroleIdのIDか?

ユーザのユーザ= 新しいユーザー(......)。
user.setRoleId(roleId)。
db.save(ユーザ)。
。db.getSession()フラッシュ(); 
役割の役割 = user.getRole();

 答え:いいえ。

 

質問4:session.get複数のコール(SerializableのID)は、データベースからすべてのクエリウィル? 

 

回答:いいえ、ちょうどキャッシュから読み出され、毎回返されていないが、同じオブジェクトであることが判明しました!同じメモリアドレスああことに注意してください!

 

質問5:あなたは同じエンティティクラス(@Entityノートプラス)のIDあなたが同じメモリオブジェクトに戻るたびに、知っていますか?

図は、これがよりよく理解され、3回のSQLの合計を実施し、理解することは困難である:3従業員は、同じオブジェクトと完全に同一である同じメモリアドレス参照、上に実際にあります!例えば、私は名前も本当にTM驚くべき、変更employee2のでemployee1名は、変更入れて!

 

既然上图里面的三个employee是同一个对象,那我们可以猜测那是因为Employee类加了@Entity注解,而这个注解会改变hashcode的值。如果查询返回一个DTO对象,是不是就应该是不同的对象了吧?马上就来验证这个猜测,看下图:

上图说明:猜对了。

 

 

上图说明:即使第2个employee是从数据库查出来的,但是由于它跟第一个employee是同一个内存对象,所以它的name属性已经被改成了内存中的那个name值了。神奇吧!

 

hibernate懒加载天坑:对于ManyToOne注解居然默认是FetchType.EAGER

EAGER是什么意思呢?比如User类有个role属性, 当加载user对象的时候,就会同时加载role对象,也就是你期望的只有一条简单sql从user表查询,但是却执行了两条sql(或者是join查询)。

所以,通常情况下对于ManyToOne注解,都需要手工设置fetch = FetchType.LAZY,否则会出现严重性能问题。

 

本文中的测试来自jframe 框架

基于spring mvc搭建的多层级多模块java web应用程序框架。包含:基础设施层、数据库定义规范、数据库访问规范、日志记录规范、多层级异常捕获、标准ajax规范、母版页规范、视图呈现规范、JavaScript框架规范等。实际上该框架定义的规范极其详细,比如数据库定义层:枚举类使用规范、datetime/bool/string字段规范、1对1、1对多、多对1、多对多外键关系映射规范、父类定义规范、字段注释规范、懒加载规范等等。。。

 

技术交流QQ群:651499479,欢迎java大神指点迷津,也欢迎新手进群学习。

 

github地址: https://github.com/leotsai/jframe

 

THE END.

オリジナル住所ます。https://www.cnblogs.com/leotsai/p/five-questions-about-hibernate-cache-and-lazy-load.html

おすすめ

転載: www.cnblogs.com/jpfss/p/11058701.html