2012-07-13 83 views
0

我正在更新Oracle数据库中的CLOB列。参数化的SQL看起来像正确执行没有错误,但是当我运行select查看更改时,它尚未更新。注意:MyBatis 3是使用JDBC参数化查询构建的,因此这些规则也适用。是否有一些技巧用Mybatis 3更新Oracle CLOB?

MyBatis的映射:

<update id="updateRSA103RequestData" parameterType="com.company.domain.RSA103XMLData" flushCache="true"> 
     update 
     RSA_SUBMIT_DATA 
     set TXLIFE_REQUEST = #{request} 
     where RSA_SUBMIT_QUEUE_ID = #{id} 
</update> 

运行日志:

2012-07-13 12:35:26728调试连接:线程主: - OOO
连接开业2012-07-13 12:35:26,837调试
PreparedStatement:线程主要: - ==>执行:更新
RSA_SUBMIT_DATA设置TXLIFE_REQUEST =?其中RSA_SUBMIT_QUEUE_ID =?
2012-07-13 12:35:26837 DEBUG的PreparedStatement:线程主: - ==>
参数:testasdfasdf(字符串),51(整数)2012-07-13 12:35:27024
调试连接:螺纹主力: - XXX连不上

变更后的选择查询:

select * 
from RSA_SUBMIT_DATA 
where RSA_SUBMIT_QUEUE_ID = 51 

RSA_SUBMIT_QUEUE_ID | TXLIFE_REQUEST | TXLIFE_RESPONSE 
51    | originalString | resultString 

映射器调用:

SqlSession sqlSession = sqlSessionFactory.openSession(); 
try { 
    log.debug("autoCommit: " + sqlSessionFactory.getConfiguration().getEnvironment().getDataSource().getConnection().getAutoCommit()); 
    PolicyTransactionMapper policyTransactionDAO = sqlSession 
       .getMapper(PolicyTransactionMapper.class); 
    RSA103XMLData xmlData = new RSA103XMLData(); 
    xmlData.setId(rsaSubmitQueueID); 
    xmlData.setRequest(request); 
    policyTransactionDAO.updateRSA103RequestData(xmlData); 

任何帮助表示赞赏。

+1

也许你忘了提交交易?你可以添加Mapper和SqlSession调用的代码吗? – Andy 2012-07-13 18:35:32

+0

自动提交已启用。我将添加mapper调用。 – Nick 2012-07-13 19:05:39

+0

好的,尽管它被设置为自动提交,但我尝试了sqlSession.commit()以查看它是否有任何区别,并且它确实如此。问题解决了。但我仍然不明白为什么它以前没有工作。谢谢! – Nick 2012-07-13 19:58:51

回答

1

我不认为你的SqlSession是用自动提交打开的。

MyBatis User Guide,要使用自动提交,请尝试。

SqlSession sqlSession = sqlSessionFactory.openSession(true);

此外,您的日志语句实际上是打开一个新的连接。请参阅DataSourceUtils.getConnection vs DataSource.getConnection

这可能会返回与您的映射器无论如何使用的连接不同的连接。