使用iBatis作为Web应用程序的数据库框架时遇到问题。我希望在几次插入后手动提交事务,但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>
答案 0 :(得分:2)
我也在学习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 :(得分:1)
元素的“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.
另外,我建议你阅读iBatis in Action。