Googleから収集できるものは次のとおりです。
Hibernateは、プロキシオブジェクトを使用して遅延読み込みを実装します。データベースからオブジェクトをロードするようにリクエストし、フェッチされたオブジェクトが別の具象オブジェクトへの参照を持つ場合、Hibernateは具象関連オブジェクトの代わりにプロキシを返します。
Hibernateは、バイトコード計測(javassistにより提供)を使用してプロキシオブジェクトを作成します。 Hibernateは、実行時にコード生成ライブラリを使用してエンティティクラスのサブクラスを作成し、実際のオブジェクトを新しく作成されたプロキシに置き換えます。
それでは、Proxyオブジェクトには正確に何が含まれていますか?
Idフィールドのみが設定されたスケルトンオブジェクト参照オブジェクトが含まれていますか? getsメソッドを呼び出すと、その他のフィールドが設定されますか?
プロキシオブジェクトには、参照オブジェクトを完全に設定するために必要なすべてのデータをフェッチするJDBCステートメントが含まれていますか。
私が見逃しているかもしれない何かがありますか?
スプーンでの餌付けは求めていませんが、すばらしいリンクを提供していただければ幸いです。
上記の説明の修正も歓迎します。
例。
class Address {
String city;
String country;
}
class Person{
int id;
String name;
Address address;
}
Personオブジェクトをロードしようとすると、HibernateはPersonクラスを次のようにサブクラス化します。
class ProxyPerson extends Person {
int id;
String name;
Address proxyCGLIBObject;
}
proxyPersonオブジェクトを返します。 ProxyPersonのオブジェクトにはidとnameの値がありますが、Addressのプロキシがあります。
私は正しいですか?
プロキシオブジェクトにtoString()メソッドを追加すると何が期待できますか?
私の本で説明されているように、 High-Performance Java Persistence 、Hibernate Proxyは実際のエンティティPOJO(Plain Old Java Object)の代わりに使用されます。
Proxyクラスは実行時に生成され、元のエンティティクラスを拡張します。
Hibernateは lazy loading を許可するためにエンティティにProxyオブジェクトを使用します。
プロキシの基本的なプロパティにアクセスする場合、呼び出しを元のエンティティに委任するだけです。
エンティティクラスのすべてのList
、Set
、Map
タイプは、PersistentList
、PersistentSet
、PersistentMap
に置き換えられます。これらのクラスは、初期化されていないコレクションへの呼び出しをインターセプトする役割を果たします。
プロキシはSQLステートメントを発行しません。 InitializeCollectionEvent をトリガーします。これは、関連付けられたリスナーによって処理され、発行する初期化クエリを認識します(設定されたフェッチプランによって異なります)。