Вставка ActiveJDBC без подготовленного оператора

Я пытаюсь использовать ActiveJDBC с БД, драйвер которой не поддерживает метод Connection.prepareStatement(String, String[]). Я получаю следующее исключение при попытке вставить:

org.javalite.activejdbc.DBException: java.sql.SQLFeatureNotSupportedException: [DataDirect][OpenEdge JDBC Driver]Unsupported method: Connection.prepareStatement(String, String[]), query: INSERT INTO ...
    at com.ddtek.jdbc.openedgebase.ddb9.b(Unknown Source)
    at com.ddtek.jdbc.openedgebase.ddb9.a(Unknown Source)
    at com.ddtek.jdbc.openedgebase.ddb8.b(Unknown Source)
    at com.ddtek.jdbc.openedgebase.ddb8.a(Unknown Source)
    at com.ddtek.jdbc.openedgebase.BaseConnection.prepareStatement(Unknown Source)
    at org.javalite.activejdbc.DB.execInsert(DB.java:597)
    at org.javalite.activejdbc.Model.insert(Model.java:2618)
    at org.javalite.activejdbc.Model.save(Model.java:2552)
    at org.javalite.activejdbc.Model.saveIt(Model.java:2477)
    ...

Поддерживаются некоторые другие формы prepareStatement, например. prepareStatement (String), prepareStatement (String, int) и т. д.

Могу ли я что-нибудь сделать, чтобы убедить ActiveJDBC не использовать неподдерживаемый оператор?


person gimoh    schedule 01.12.2015    source источник
comment
String[] предназначен для автоматически сгенерированных ключей. Вам нужны автоматически сгенерированные ключевые значения?   -  person lance-java    schedule 01.12.2015
comment
Нет, не знаю. Все, что я делаю в коде, это m = new Model();, заполняю его, затем m.saveIt();, в модели нет автоматически сгенерированных столбцов. ActiveJDBC вызывает метод prepareStatement внутри здесь   -  person gimoh    schedule 01.12.2015
comment
какую базу данных/драйвер вы используете?   -  person ipolevoy    schedule 01.12.2015
comment
Я использую СУБД OpenEdge и их проприетарный драйвер com.ddtek.jdbc.openedge.OpenEdgeDriver, это устаревшая БД, с которой мне приходится взаимодействовать.   -  person gimoh    schedule 02.12.2015


Ответы (2)


Как вы можете видеть в source , это довольно жестко запрограммировано. Итак, на мой взгляд, вы можете либо запросить изменение в ActiveJDBC, либо продолжить обертывание вашего «несовершенного» соединения в настраиваемую реализацию и переопределить это prepareStatement(String, String[])

public PreparedStatement prepareStatement(String qry, String[] autoIdColumns) {
  return delegate.prepareStatement(qry);
}

Google вернул несколько идей для ConnectionWrapper существуют.

person Jan    schedule 01.12.2015
comment
Как бы я передал такое завернутое Connection в AJ? Это как-то связано с использованием Base.open(DataSource dataSource)? - person gimoh; 01.12.2015
comment
Я не настолько глубоко в AJ. Но это кажется правильным - если вы передадите DataSource, то этот DataSource, в свою очередь, создаст соединения. откуда вы берете DataSource? - person Jan; 01.12.2015
comment
На самом деле понятия не имею, я до сих пор не использовал DataSoruces, это была единственная вещь, которую я мог видеть в AJ API, которая, казалось, позволяла переопределить Connection. Я покопаюсь в этом, спасибо @Jan - person gimoh; 01.12.2015
comment
Узнайте, как создать DataSouce, здесь: github.com/javalite/activejdbc/blob/master/activejdbc/src/test/ и: github.com/javalite/activejdbc/blob/master/activejdbc/src/test/ - person ipolevoy; 01.12.2015

Пожалуйста, посмотрите базы данных, поддерживаемые ActiveJDBC: http://javalite.io/activejdbc#supported-databases. Каждая тщательно тестируется.

person ipolevoy    schedule 01.12.2015