7

これが完全に重複している場合は訂正してください。このトピックが頻繁に議論されていることは知っていますが、決定的な答えを見つけることができません。

質問:

MVC WebアプリでHibernateオブジェクトを処理するための最良の実用的なソリューションは何ですか?

詳細:

私はHibernateを使用しており、可能な場合は遅延読み込みを活用したいと考えています。
私はMVCスタイルのWebアプリで作業しています。
遅延読み込みの初期化の例外を取得するのは嫌いです。
トランザクション間でHibernateオブジェクトを再アタッチする必要はありません。

オプション:

  1. 熱心にすべてをロード
    • 怠惰な初期化の問題を解決しますが、クエリが大きくなります
  2. 「ビューでセッションを開く」という概念を使用する
    • 私はそれのシンプルさが大好きです
    • オブジェクトは引き続き再接続する必要があり、AJAXyセットアップでは、かなり頻繁に再接続する必要があります
    • すべてのリクエストに対してセッションが開かれます
  3. トランザクションを終了する前に必要な「タッチ」アイテム
    • せいぜい薄っぺらなようです..そして退屈です
  4. ビューに実際のHibernateオブジェクトが表示されないように、異なる単純化された「分離」オブジェクトを作成します
    • これらは完全なHibernateオブジェクトよりも単純である可能性があるため、モデルの完全な熱心なロードとは異なります。
    • 私はこれが場所で推奨されていると聞きましたが、より多くの責任/コード/仕事のようです
  5. Hibernateオブジェクトを操作したいときはいつでもセッションを開きます。
    • これはSpringServiceレイヤーにうまくまとめることができますが、場合によっては過剰に見えることもあります。例:私はしたいのですhibernateObject.getRelatedObjects()が、次のようなことを言う必要がありますspringService.getRelatedObjects(hibernateObject)

私は何かが足りないのですか?
私は物事を考えすぎましたか?
私は物事を過小評価しましたか?

PS:

Webフレームワークの場合、私はZKを使用していますが、ZK固有の回答は必要ありません
私もSpringを使用していますが、Spring固有の回答はどこにでもあるので、かっこいいです。

4

3 に答える 3

5

4-ish を使用 - ビューでオープン セッションを使用しないでください。休止状態のエンティティをビューまでバブルさせず、代わりに休止状態のエンティティとドメイン オブジェクトまたは「ビュー Bean」の間でトランスフォーマーを変換させます。働きたい。

Hibernate エンティティは、ドメイン モデルや UI 表現ではなく単なる永続化戦略であると考えています。

于 2013-01-16T14:11:34.557 に答える
3

次の 3 つの方法があります。

属性に熱心なフェッチ ロードを使用する:大きなデータ テーブルがある場合は問題になる可能性があります。

OpenSessionInView というフィルターを使用します。このフィルターは、Web ページが完全にロードされるまでセッションを開いたままにします。このロードで Hibernate オブジェクトが要求された場合、セッションが開かれ、遅延ロードの例外が回避されます。

ユーザー VO (Valueble オブジェクト):アプリケーションには、2 種類のオブジェクトがあります。永続化レイヤーとビジネス レイヤーの間で受け渡すオブジェクトと、ビュー レイヤーのオブジェクト。たとえば、UserVO と UserModel です。vo は、ビューとビジネス レイヤーの間で情報を転送するために使用されます。ビジネスの実装では、vo を使用してモデル オブジェクトを埋め、永続化レイヤーに送信します。このパターンを使用すると、必要なときにすべての必要な情報が vo オブジェクトに入力されるため、遅延読み込み例外が発生することはありません。

OpenSessionInView
Eager
Fetching Load
Hibernate パフォーマンスのヒント

于 2013-01-16T14:35:16.623 に答える
1

プレゼンテーション レイヤーとデータ アクセス レイヤーを混在させることは、設計上の問題です。

ビューはコントローラーを介してモデルにアクセスする必要がありますが、Hibernate オブジェクトを直接使用することで、レイヤーを混合しています。IMO データ アクセスは、モデルの下の別のレイヤーにする必要があります。エンティティに注釈が付けられているか、xml で定義されている場合でも、それらはモデル自体とは別のものです。

Hibernate ロジックをカプセル化する Facade または Manager を導入し、コントローラーのサービス コントラクトを介して公開し、それらのエンティティを表す意味のあるオブジェクトを返します。もしそうなら、私はオプション4に行きます。

于 2013-01-16T14:18:20.023 に答える