Извлечение собственного соединения из обернутого соединения JBOSS

#spring #jboss7.x #jdbctemplate

#spring #jboss7.x #jdbctemplate

Вопрос:

Мне нужно передать объект массива в Oracle 11 DB. Я использую аннотации на основе Spring 3.1 и использую SimpleJdbcCall для вызова процедуры на сервере JBOSS. Здесь уместно jdbcCall .

 SimpleJdbcCall call = new SimpleJdbcCall(dataSource)
                              .withoutProcedureColumnMetaDataAccess()
                              .withProcedureName(IbeginDataBaseConstants.PROCEDURE_CREATE_NEW_ADMIN.VAL)
                              .declareParameters(new SqlParameter("inUserEmpID", OracleTypes.INTEGER))
                              .declareParameters(new SqlParameter("inCountryIDs", OracleTypes.ARRAY, "ibo_number_array" ))
                              .declareParameters(new SqlParameter("inSysRoleID", OracleTypes.INTEGER))
                              .declareParameters(new SqlParameter("inLoggedIn", OracleTypes.INTEGER))
                              .declareParameters(new SqlOutParameter("outStatus", OracleTypes.CHAR))
                              .declareParameters(new SqlOutParameter("outMsg", OracleTypes.VARCHAR));
 

Как вы можете видеть inCountryIDs , это массив, который мне нужно отправить.

С помощью Google я смог найти несколько способов отправки массива в БД. Вот первый.

 SqlTypeValue value = new AbstractSqlTypeValue() {
      protected Object createTypeValue(Connection conn, int sqlType, String typeName) throws SQLException {
        ArrayDescriptor arrayDescriptor = new ArrayDescriptor(typeName, conn);
        ARRAY idArray = new ARRAY(arrayDescriptor, conn, ids);
        return idArray;
      }
 

И я добавил его в источник параметров, используя

             sourceMap.addValue("inUserEmpID", newAdmin.getEmpId());
    sourceMap.addValue("inCountryIDs", value);

    sourceMap.addValue("inSysRoleID", newAdmin.getRoleId());
    sourceMap.addValue("inLoggedIn", newAdmin.getLoggedInId());
 

И исключение, которое я получил, было
org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 cannot be cast to oracle.jdbc.OracleConnection

Я понял причину, для реализации SqlTypeValue требуется OracleConnection, тогда как Spring передает WrappedConnection .

Итак, я попытался развернуть соединение с помощью WrappedConnection class с помощью этого кода.

 WrappedConnection wrappedConnection = conn.unwrap(WrappedConnection.class);
 

Но здесь исключение было

 Not a wrapper for: org.jboss.jca.adapters.jdbc.WrappedConnection
 

В другой попытке я попытался преобразовать существующее соединение в WrappedConnection, используя явное приведение с помощью this.

 WrappedConnection wrappedConn = (WrappedConnection)conn;
 

И все равно не повезло.
Исключение.

 org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 cannot be cast to org.jboss.jca.adapters.jdbc.WrappedConnection
 

Ну, все, что мне нужно было сделать, это получить базовое соединение, поэтому я попытался использовать его, WrappedConnectionJDK6 чтобы я мог вызвать соответствующий метод там.

 WrappedConnectionJDK6 wrappedConnection = (WrappedConnectionJDK6)conn;
 

приводит к
тому, что org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 не может быть преобразован в org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6

И второй подход

 Map in = Collections.singletonMap("inCountryIDs", new SqlArrayValue(idsArray));
 

Проблема с этим подходом заключается в том, что Collections.singletonMap возвращает неизменяемую карту. Итак, я не могу использовать его для добавления дополнительных параметров.

Есть ли какой-либо способ, с помощью которого я могу получить базовое соединение в обернутом соединении JBoss? Или есть какой-либо другой механизм, с помощью которого я могу передать параметр массива без необходимости взаимодействия с соединением?