Hibernate が短期間のセッション用に設計されているように見えるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/124453

  •  02-07-2019
  •  | 
  •  

質問

これが主観的な質問であることは承知していますが、Hibernate が短期間のセッション向けに設計されているように見えるのはなぜですか?通常、私のアプリでは DAO を作成してデータ層を抽象化しますが、エンティティ オブジェクトがどのように使用されるかを予測できないため、コレクションの一部は遅延読み込みされるか、セッションが閉じられると読み込みに失敗します。

なぜ自動的にセッションを再度開くか、セッションが常に開いたままになるように設計しなかったのでしょうか?

役に立ちましたか?

解決

トランザクション境界の外に移動すると、新しいトランザクションを開始しない限り、データベースに再度アクセスすることはできないためです。「万が一に備えて」トランザクションを長時間実行するのは悪いことです (tm)。

ビューからオブジェクトを遅延読み込みしたいと思います - 見てください ここ いくつかのオプションについては。私は、セッション ファサード メソッドによって返されるオブジェクト マップの量を正確に定義することを好みます。これにより、ビジネス層の単体テストとパフォーマンス テストが容易になることがわかりました。

他のヒント

私は EJB と Hibernate を使用するデスクトップ アプリに取り組みました。設定する必要がありました lazy=false オブジェクトがシリアル化されると、バックエンドからフェッチできなくなるためです。残念ながら、その通りです。

パフォーマンスを重視する場合は、バックエンドでキャッシュを使用すると、非遅延フェッチの負担が軽減されます。

OpenSessionInView パターンを探しています。これは本質的に、セッションを透過的に再オープンする必要があるときを検出する概念的なフィルター (サーブレット フィルターとして実装される場合もあります) です。いくつかのフレームワークはこれを実装し、自動的に処理します。

私はデスクトップ アプリケーションを作成しているため、フィルターの使用は適用できません。

接続は希少なリソースであり、使用後はすぐにリサイクルする必要があります。接続プーリングも使用している場合は、必要なときに別の接続プーリングをすぐに取得できるはずです。これは、Web サイトを拡張するために使用する必要があるアーキテクチャです。たとえデスクトップ アプリであっても、そのユースケースはおそらくスケーラブルなサイトに集中しています。

MS ADO.NET を見ると、接続を短期間開いておくことに同様の焦点が当てられていることがわかります。MS ADO.NET には、データを切断した状態で更新し、準備ができたらデータベースに適用するための完全なオフライン モデルがあります。

Hibernate は、オブジェクトをリレーショナル データベース テーブルにマップする方法として設計されています。それはその仕事を非常にうまく達成します。しかし、常にすべての人を満足させることはできません。初期化がどのように機能するかを知るには多少の複雑さがあると思いますが、コツを掴めば理解できます。それが必ずしもあなたを怒らせるために特別に「設計された」かどうかはわかりませんが、それが起こったというだけです。

Web アプリ以外のセッションが魔法のように再開されるとしたら、フレームワークを学習する複雑さの方が利点をはるかに上回ると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top