15を超える関連エンティティ(親)を持つオブジェクトを使用しています。私のUI側では、これらのエンティティのIDのみが必要なので、Hibernateのフェッチ機能は必要ありません。また、レイジープロキシの概念を使用して、データベースへのヒットを回避し、IDが入力されたオブジェクトを作成します。 。
これを実現するには、すべての親エンティティに対してフィールドアクセスの代わりにプロパティアクセスを使用する必要があります。
@Id
@Access(AccessType.PROPERTY) // this helps to avoid database hit on get, but not on set!!!
private Long id;
これまでのところ、データベースからオブジェクトをロードし(追加の結合は作成されません)、すべてのリレーション(最大で単純な選択入力)を使用してWebUIに表示します。UIのクローン(値オブジェクト)を作成せず、デタッチされた休止状態オブジェクトを直接使用します。しかし、UIに変更を加える(親オブジェクトを変更する)と、フレームワークは関連するプロキシエンティティに対してsetId()を呼び出し、....これによりこれらのプロキシが初期化されます。これを行うHibernateBasicLazyInitializerのコードは次のとおりです。
else if ( method.equals(setIdentifierMethod) ) {
initialize(); // Here the db hit occurs!!
setIdentifier( (Serializable) args[0] );
return INVOKE_IMPLEMENTATION;
}
そして、LazyInitializationExceptionが発生します(確かに、この時点ではセッションがありません!)。
それで、データベースからフェッチされたすべてのエンティティの値オブジェクトを作成せずにこれを行うためのアプローチはありますか?私は常にUIでデータオブジェクトを直接使用していましたが、それらはすべて完全にフェッチされており(プロキシではありません)、これらのプロキシで現在のような問題は発生していません...
なぜHibernateが@IDフィールドの設定時にプロキシの初期化を行うのか(取得にはしませんが)、私は本当に理解していません...
前もって感謝します!