Manual commit is not allowed over a Spring managed

Manual commit is not allowed over a Spring managed SqlSession
Manual close is not allowed over a Spring managed SqlSession
具体展开就像这样:
WARN [DisposableBeanAdapter.java:364] : Invocation of destroy method ‘close’ failed on bean with name ‘sessionTemplate’: java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSession

在使用JUnit测试的时候,出现这两种报错,错误原因都是一样的,通过报错信息,查看SqlSessionTemplate源码可以看到:

/**
   * {@inheritDoc}
   */
  @Override
  public void commit() {
    throw new UnsupportedOperationException("Manual commit is not allowed over a Spring managed SqlSession");
  }

触发了上面这个异常,再看自己的Mybatis的配置:

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"> 
        <constructor-arg index="0" ref="sqlSessionFactory" /> 
    </bean> 
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:framework/mybatis/mapper-config.xml"></property>
    </bean>

在这里,我们已经通过XML,将SqlSession配置完全,每次在使用sqlsession的时候,我们只要通过@Autowried获取就行,在调用了sqlsession.insert或者sqlsession.select之类的方法之后,不需要我们手动去commit或者close。

配置好的SqlSession将自动完成commit,并在执行完sql之后自动close。

也就是说我们如果手动sqlsession.commit或者close,实际上是重复了一个动作。

我的代码,在sqlseesion.insert执行完毕之后又执行了sqlsession.commit,数据库中是出现了重复的数据的。这也证明了mybatis是自动执行的。

查阅了相关的资料之后,看到如下内容:
SqlSessionTemplate是一个代理类,内部它会为每次请求创建线程安全的sqlsession,并与Spring进行集成,在方法执行完毕之后会自动关闭。
mybatis中的sqlsession本身是一个快速创建和销毁的类,在于spring的配合中最好不要直接操作sqlsession,让spring自动管理。在dao中不要直接配置sqlsession,可以使用SqlsessionDaoSupport并且配置为@Repository就可以了

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值