Mybatis-Spring交易关闭会议

时间:2014-09-04 16:17:18

标签: java spring transactions ibatis

当我使用Spring事务处理MyIbatis时,使用Annotation驱动的声明方法,我是否已经麻烦地管理会话。

没有交易,我通常会这样做:

public int insertPnt(Movimenti value) {
    try (SqlSession session = sqlSessionFactory.openSession()) {
    for (Movimenti value : values) {
        session.insert(
                    "com.sirio.cisl.dal.MovimentiMapper.insertSelective",
                    value);
        }
    } catch (Exception e) {
        log.error("Error inserting movimenti "+user+" anno "+anno+" "+ e.getMessage());
        throw e;
    }
}

但是我从MyIbatis-Spring文档中读到了

  

MyBatis SqlSession为您提供了要处理的特定方法   以编程方式进行的...........   。这意味着Spring将始终处理您的问题   交易。   你不能调用SqlSession.commit(),SqlSession.rollback()或   SqlSession.close()通过Spring托管的SqlSession。

所以当我只是将@Transaction注释(和<tx:annotation-driven>配置)添加到方法中时,我正在徘徊。

@Transactional(rollbackFor=Exception.class)
public int insertPnt(Movimenti value) {
    try (SqlSession session = sqlSessionFactory.openSession()) {

    ..............

}

交易经理是否负责会话资源?或者我必须删除try-catch子句。

谢谢

1 个答案:

答案 0 :(得分:0)

我将相同的问题发布到MyIbatis用户组see。回复非常有用:

  

要使用MyBatis,您需要SqlSesion或Mapper接口。   随着&#34;经典&#34; MyBatis你得到的会话   SqlSessionFactory但在使用Spring时会发生变化。

所以我按照documentation的例子: 我使用sqlSessionTemplate注入Service类,该内部负责打开和关闭会话。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:myibatis.xml"/>
    <property name="mapperLocations" value="classpath*:mappers/*.xml" />
</bean>


<bean id="asTableService" class="com.sirio.cisl.dal.AsTableService">
    <property name="session" ref="sqlSession" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
  <constructor-arg index="0" ref="sqlSessionFactory" />
  <constructor-arg index="1" value="BATCH" />
</bean>

然后我可以使用@Transactional注释:

@Transactional(rollbackFor=Exception.class)
public int insertPnt(Movimenti value) {
      session.create(......)
 }

的Davide