Как остановить iBatis, фиксирующий вставки, обновления и удаления?

#ibatis

#ibatis

Вопрос:

У меня проблема с использованием iBatis в качестве основы базы данных для веб-приложения. Я хочу вручную зафиксировать транзакцию после пары вставок, но iBatis автоматически фиксирует ее после каждой вставки. Как я могу это предотвратить?

Вот мой SqlMapConfig.xml содержимое файла:

 <sqlMapConfig>

<settings enhancementEnabled="true"
    errorTracingEnabled="true"
    useStatementNamespaces="false" />

<transactionManager type="JDBC" commitRequired="false" >
    <dataSource type="JNDI">
        <property name="DataSource"
            value="java:/comp/env/jdbc/MY_DB" /> 
    </dataSource>
</transactionManager>

<sqlMap resource="com/my/common/Common.xml" />

</sqlMapConfig>
  

Ответ №1:

Я также изучаю Ibatis / MyBatis и постепенно разбираюсь в этом. Я не могу рассказать вам обо всех различных атрибутах sqlMapConfig, поскольку я не уверен в некоторых настройках, но я так понимаю, вы хотите, чтобы несколько вставок были включены в одну транзакцию? Аналогично пакетному обновлению, оберните пакет в одну транзакцию. Этот пример основан на iBatis 2.3.4

 try {
        sqlMap.startTransaction();
        sqlMap.startBatch();
        for (final ObjectXXXDTO objectReference1 : GenericObjectList) {
            sqlMap.insert("createExample1", objectReference1);
        }
        sqlMap.insert("createExample2", otherReference2);
        sqlMap.insert("createExample3", otherReference3);
        sqlMap.executeBatch();
        sqlMap.commitTransaction();
    } catch (final SQLException e) {
        throw new XXXException(e);
    } finally {
        try {
            sqlMap.endTransaction();
        } catch (SQLException e) {
            throw new XXXException(e);
        }
    }
  

Однако обратите внимание, что всякий раз, когда вы используете пакетный набор инструкций, ключи, сгенерированные базой данных, не будут сгенерированы, пока вы не вызовете executeBatch() метод. Это означает, что если вы используете selectKey для обновления своих объектов сгенерированные ключи, они вернут null. Если у вас есть какой-либо объект, для которого требуется вновь сгенерированный ключ как часть другой вставки, вы можете выполнить эту вставку или обновление до startBatch() .

Опять же, я не уверен, тот ли это подход, который вам нужен, но я все равно думал опубликовать его. Спасибо

Комментарии:

1. Эта идея хороша, и она работает, но это не то, что мне нужно. В любом случае, спасибо.

Ответ №2:

атрибут элемента «commitRequired» — это то, что вам нужно.

 The <transactionManager> element also allows an optional attribute commitRequired that can be true or
false. Normally iBATIS will not commit transactions unless an insert, update, or delete operation has been
performed. This is true even if you explicitly call the commitTransaction() method. This behavior
creates problems in some cases.
  

Руководство по MyBatis

Кроме того, я бы рекомендовал вам прочитать iBatis в действии.