0

EntityManager私の質問は、Transaction が Spring Container から開始されてから休止状態セッションを取得しているという問題のシナリオに固有のものでしEntityManagerた。

全体の流れ:

  1. アプリケーションentityManager.createNativeQuery(searchQuery)では、いくつかのデータを選択する必要があります。

  2. entityManager設定したいセッションで休止状態セッションを取得する必要がありますnls_comp/またはクエリ自体nls_sortを実行できます。entityManager例えばセッションセットを変更しnls_comp=linguisticます。

  3. 完了したら、これらのオプションをもう一度無効にして、以前の状態に戻したいと思います。ほとんどの場合、休止状態セッションまたは何らかのメカニズムを閉じることによって。それは正しいアプローチですか?

2 alter コマンドに対しても別のトランザクションを開始する必要があります (いくつかの例外を与えてみました)。それを達成する方法と、春に開始されたトランザクション内で休止状態のセッションがどのように管理されているかを教えてください。または、entityManagerそれ自体で有効化/無効化を達成できます。

4

1 に答える 1

0

これはあなたがそれを行う方法です:

org.hibernate.Session session = (Session) entityManager.getDelegate();
session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        PreparedStatement statement = null;
        try {                 
            statement = connection.createStatement();
            statement.addBatch("ALTER SESSION SET NLS_COMP = LINGUISTIC");
            statement.addBatch("ALTER SESSION SET NLS_SORT = SPANISH_M");
            statement.executeBatch();
        }
        finally {
            if(statement != null) {
                statement.close();
            }           
        }                                
    }
});
  1. getDelegate() を使用して、entityManager からセッションを取得できます。
  2. 現在関連付けられている接続でこれら 2 つのステートメントを実行できます。
  3. 変更は現在のデータベース セッションのみに適用され、接続が閉じられるとデフォルトに復元される必要があります。接続プーリングの場合、それらが永続化されるかどうかを確認する必要があります。

session.close() を呼び出す必要はありません。Thins は、現在のトランザクションを閉じるときに Spring を自動的に処理します。セッションを手動で閉じる必要があることはほとんどありません。

現在の設定のロジックを実行したい場合は、AOP アスペクトを記述して 1. と 2. を実行することをお勧めします。その後、finally ブロックで以前の値にリセットするためだけに呼び出しを通過させます。独自の注釈を定義して、このロジックを有効にしたいすべてのサービス メソッドをマークできます。とにかく、Spring ポイントカットは注釈ベースの選択をサポートします。

于 2014-07-10T06:27:20.110 に答える