throw ex.getCause();
throw ex.getTargetException();
    public Object invoke(Object proxy, Method method, Object[] args)         throws Throwable     {        checkCorrectness(method);                try {            if (method.equals(PREPARED_STATEMENT_CLOSE)) {                handleStatementClose(statement, proxy);                return Void.TYPE;            } else            if (method.equals(PREPARED_STATEMENT_GET_CONNECTION)) {                return associatedConnection;            } else            if (method.equals(PREPARED_STATEMENT_SET_CONNECTION)) {                this.associatedConnection = (Connection)args[0];                return Void.TYPE;            } else            if (method.equals(PREPARED_STATEMENT_GET_ORIGINAL)) {                return preparedStatement;            } else            if (method.equals(PREPARED_STATEMENT_FORCE_CLOSE)) {                preparedStatement.close();                return Void.TYPE;            } else                return method.invoke(preparedStatement, args);        } catch(InvocationTargetException ex) {            throw ex.getCause();        }    }