2

最初に作成されたセッションとは異なるセッションでオブジェクトを更新することは、Hibernate で悪い習慣ですか? Hibernate セッション (デフォルト) はそのセッション オブジェクトをキャッシュし、セッションが閉じられるかオブジェクトが削除されるとそれらを解放するため、答えはイエスだと思います。したがって、あるセッションでオブジェクトを作成し、別のセッションでそれを更新する (最初のセッションでオブジェクトがまだ「生きている」間) ことは、私には悪い習慣のように思えます。誰も理由を説明できますか、影響は何ですか? たとえば、次のコードを考えてみましょう (わかりやすくするために短縮されています)。

private void updateRequest(Request req){ //Request came from another Hibernate Session
        MyDAO myDB = null;
        myDB = new MyDAO();
            Transaction trans = myDB.getSession().beginTransaction();
            myDB.getSession().update(object);
            trans.commit();
    }
4

1 に答える 1

1

これは「Session per operation anti-pattern」と呼ばれます。ここでは、問題をより適切に説明する休止状態のドキュメントからの引用を示します。

session-per-operation アンチパターンを使用しないでください。1つのスレッドで単純なデータベース呼び出しごとに Session を開いたり閉じたりしないでください同じことがデータベース トランザクションにも当てはまります。アプリケーションでのデータベース呼び出しは、計画されたシーケンスを使用して行われます。それらは作業の原子単位にグループ化されます。これはまた、このモードはアドホック SQL コンソール作業を目的としているため、すべての SQL ステートメントの後の自動コミットはアプリケーションでは役に立たないことを意味します。Hibernate は、自動コミット モードをすぐに無効にするか、アプリケーション サーバーが無効にすることを期待します。データベース トランザクションはオプションではありません。データベースとのすべての通信は、トランザクション内で発生する必要があります。多くの小さなトランザクションは、明確に定義された 1 つの作業単位よりも優れたパフォーマンスを発揮する可能性は低いため、データ読み取りの自動コミット動作は避ける必要があります。後者は、保守性と拡張性にも優れています。

于 2013-05-09T16:35:10.630 に答える