如何在执行特定查询后更改会话NLS_COMP / SORT

时间:2014-07-10 05:51:56

标签: java spring hibernate session nls-comp

我的问题特定于某些问题场景,其中使用EntityManager从Spring容器启动事务,然后我从EntityManager获取hibernate会话。

整体流程:

  1. 在应用程序entityManager.createNativeQuery(searchQuery)中可以选择一些数据。

  2. 我需要从entityManager中取出hibernate会话,然后在我要设置nls_comp / nls_sort的会话中,或者我可以在{{1}中执行查询本身。例如alter session set entityManager

  3. 完成后我想再次禁用这些选项回到之前的状态。最有可能是通过关闭hibernate会话或某种机制。这是正确的做法吗?

  4. 我是否应该为2 alter命令启动另一个事务(我试过它给了一些例外)。请让我知道如何实现它以及如何在spring启动的事务中管理hibernate会话,或者我可以使用nls_comp=linguistic本身实现启用/禁用。

1 个答案:

答案 0 :(得分: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()
  2. 从entityManager获取会话
  3. 您可以在当前关联连接中执行这两个语句
  4. 更改仅适用于当前数据库会话,当连接关闭时,应将其还原为默认值。对于连接池,您必须检查它们是否被持久化。
  5. 您不需要调用session.close(),当关闭当前事务时,会自动处理Spring。您必须手动关闭会话。

    如果你想为当前设置执行一个逻辑,最好写一个AOP方面来执行1.和2.然后让调用只通过将它重置回到之前的值。终于阻止了。您可以定义自己的注释,以标记您希望启用此逻辑的所有服务方法。 Spring切入点无论如何都支持基于注释的选择。