Hibernateのドキュメントによると:
配列が怠惰になることはないことを確認した後、リスト、マップ、およびidbagが最もパフォーマンスの高い(非逆)コレクションタイプであると結論付けることができます。
だから私の質問は非常に単純です:なぜ配列は1対多の関連付けで遅延ロードできないのですか?
Hibernateのドキュメントによると:
配列が怠惰になることはないことを確認した後、リスト、マップ、およびidbagが最もパフォーマンスの高い(非逆)コレクションタイプであると結論付けることができます。
だから私の質問は非常に単純です:なぜ配列は1対多の関連付けで遅延ロードできないのですか?
遅延読み込みは、Hibernateがプロキシされてデータに初めてアクセスしようとしたときに知ることができる構造を使用するという事実によって機能します。これを行うと、これらの構造はhibernateに情報をロードする必要があることを通知し、Hibernateは何が起こっているかを知らなくてもオンザフライでこれを実行します。
aaload
「[]」演算子(バイトコード)をプロキシできないため、Hibernateは初めて配列にアクセスしようとしていることを知る方法がないため、配列を遅延ロードすることはできません。Hibernateはいつ配列を知ることはありません。最初にアクセスしようとしたため、その場でロードできませんでした。
コレクションを使用するときは、常にメソッドを介してコレクションにアクセスする必要があるため、Hibernateは、コレクションに初めてアクセスしてからロードしようとするときに、100%確実になります。
したがって、本当の理由は、コードを配列アクセス演算子にフックする方法がないということです。フィールドの遅延読み込みでも同じことが起こります。Hibernateは、フィールドにアクセスしようとしたときにわからないため、フィールドのみのアクセス権を持つ非コレクションプロパティを遅延読み込みできません。常にget/setメソッドアクセスが必要です。
これがどのように行われるかの例として、PersistentList
Hibernateのコレクションを確認できます。そのindexOf
メソッド(および他の多くのメソッド)では、read
メソッドは次のように呼び出されます。
public int indexOf(Object value) {
read();
return list.indexOf(value);
}
そして最後にread
、コレクションがまだ遅延ロードされていない場合、メソッドはコレクションを初期化します。