Как остановить iBatis при добавлении, обновлении и удалении? - PullRequest
0 голосов
/ 07 ноября 2011

У меня проблема с использованием 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>

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Я также изучаю 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 для обновления ваших объектов сгенерированными ключами, они будут возвращать ноль. Если у вас есть какой-либо объект, для которого требуется, чтобы вновь сгенерированный ключ был частью другой вставки, вы можете выполнить эту вставку или обновить до startBatch().

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

1 голос
/ 11 ноября 2011

атрибут "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 guide

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...