我的问题特定于某些问题场景,其中使用EntityManager
从Spring容器启动事务,然后我从EntityManager
获取hibernate会话。
在应用程序entityManager.createNativeQuery(searchQuery)
中可以选择一些数据。
我需要从entityManager
中取出hibernate会话,然后在我要设置nls_comp
/ nls_sort
的会话中,或者我可以在{{1}中执行查询本身。例如alter session set entityManager
。
完成后我想再次禁用这些选项回到之前的状态。最有可能是通过关闭hibernate会话或某种机制。这是正确的做法吗?
我是否应该为2 alter命令启动另一个事务(我试过它给了一些例外)。请让我知道如何实现它以及如何在spring启动的事务中管理hibernate会话,或者我可以使用nls_comp=linguistic
本身实现启用/禁用。
答案 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();
}
}
}
});
您不需要调用session.close(),当关闭当前事务时,会自动处理Spring。您必须手动关闭会话。
如果你想为当前设置执行一个逻辑,最好写一个AOP方面来执行1.和2.然后让调用只通过将它重置回到之前的值。终于阻止了。您可以定义自己的注释,以标记您希望启用此逻辑的所有服务方法。 Spring切入点无论如何都支持基于注释的选择。