質問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