0

我的问题特定于一些问题场景,其中事务从 Spring Container 启动,EntityManager然后我从EntityManager.

整体流程:

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

  2. 我需要entityManager在我要设置的会话中退出休眠会话nls_comp/nls_sort或者我可以自己执行查询entityManager。例如更改会话集nls_comp=linguistic

  3. 完成后,我想再次禁用这些选项回到以前的状态。很可能是通过关闭休眠会话或某种机制。这是正确的方法吗?

我是否也应该为 2 alter 命令启动另一个事务(我试过它给出了一些异常)。请让我知道如何实现它以及如何在 spring 启动的事务中管理休眠会话,或者我可以自己实现启用/禁用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. 您可以在当前关联的连接中执行这两个语句
  3. 这些更改仅适用于当前数据库会话,当连接关闭时,它们应恢复为默认值。对于连接池,您必须检查它们是否被持久化。

你不需要调用 session.close(),当关闭当前事务时,thin 会自动处理 Spring。您很少需要手动关闭会话。

如果要为当前设置执行逻辑,最好编写一个 AOP 方面来执行 1. 和 2. 然后让调用通过,仅将其重置为 finally 块中的先前值。您可以定义自己的注释来标记您希望启用此逻辑的所有服务方法。无论如何,Spring 切入点都支持基于注释的选择。

于 2014-07-10T06:27:20.110 回答