0

かなり複雑なドメイン エンティティがあります。すべての関連付けに対して遅延読み込みが必要です。したがって、シナリオは次のようになります。

1. ビジネス ロジックのインスタンスを取得します。

2.ビジネスからオブジェクトを取得します。

3. 他の関連オブジェクトを私に与えるように o に依頼します。

4.ビューを準備します。

他のオブジェクトを遅延ロードするときに閉じられたセッションに関する休止状態の例外を取り除くために、コントローラーでセッション全体を開いたり閉じたりするという考えに至りました。それは良い考えですか?より良い解決策はありますか?

ありがとうございました

4

4 に答える 4

1

ビュー内のセッションは悪い習慣です。

この問題を回避するために通常使用されるレイヤーの提案を次に示します。

コントローラ

  • コントローラーは、Web 要求の処理、サービスが処理するオブジェクトへの解釈、サービスの結果を Web 応答として返すことのみに関与します。私は通常、各コントローラー メソッドで 1 つのトランザクション サービス メソッド呼び出しのみを使用し、1 つのコントローラー操作のすべてのデータ アクセスを 1 つのトランザクション内に保持することを好みます。

サービス

  • サービス レイヤーは、コントローラーからデータを受け取り、操作を実行するために必要なデータを (データ レイヤーから) 取得し、意味のある結果を返すことにのみ関係します。サービスは、コントローラーが必要とするすべての遅延読み込みエンティティを完全に読み込む必要があります。ここでのサービス メソッドはトランザクションであり、遅延読み込みの問題はなく、複数の DAO から結果を集めることができます。そうすれば、DAO はお互いのことを知る必要がありません。

データアクセス

于 2012-07-27T17:44:25.907 に答える
0

設計パターンとして、ビューでセッションを開くのは非常に悪いです。SpringMVC には、セッションを開いて問題を解決する設定があると思います。

ただし、アプリケーションがペット ショップよりも複雑な場合は、このパターンを使用しないことをお勧めします。データ取得とビジネス ロジックを 1 層下に移動し、UI 関連のコードのみをコントローラーに残すことをお勧めします。関係を考えて、それらに熱心で怠惰な設定を設定することはうまくいくはずです。分析なしですべてを遅延に設定することはお勧めできません。リクエストごとに数百回の SQL 呼び出しが発生します。

L2 キャッシュ (EHCache など) を Hibernate に接続することをお勧めします。構成と使用法は本当に簡単です。

于 2012-07-27T10:53:22.400 に答える
0

Spring には、この機能を処理するopensessioninviewfilterと がopensessininviewinterceptorあります。

于 2012-07-27T10:51:00.613 に答える
0

実際にそれを行うことができ、Spring と Hibernate を使用する場合の一般的なパターンです。以下のコードを web.xml に入れることで、非常に簡単に有効にすることができます。

<filter>
    <filter-name>lazyLoadingFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>lazyLoadingFilter</filter-name>
    <url-pattern>/mvc/*</url-pattern>
</filter-mapping>

これを配置すると、その呼び出し内で行われた休止状態のすべての呼び出しで同じセッションが使用されます。

@Autowired
protected SessionFactory sessionFactory;

protected Session getSession() {

    return SessionFactoryUtils.getSession(sessionFactory, true);
}

ただし、Peter Gwiazda が言うように、アプリケーションの規模と複雑さに応じて、これを実行したい場合と実行したくない場合があります。オブジェクトが非常に複雑であるように思われるため、JSP 内のエンティティをトラバースするときにビューが本質的により多くの SQL ステートメントをトリガーするか、優れたパフォーマンスにつながらないようです。

一般に、ビューが必要とするものだけを使用してオブジェクトを DTO に変換し、データベースから取得するデータの量を制限することをお勧めします。

于 2012-07-27T11:14:14.090 に答える