Java MyIbatis Spring事务关闭会话

Java MyIbatis Spring事务关闭会话,java,spring,transactions,ibatis,Java,Spring,Transactions,Ibatis,当我将MyIbatis与spring事务一起使用时,使用注释驱动的声明性方法,我是否需要管理会话 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" > <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:m

当我将MyIbatis与spring事务一起使用时,使用注释驱动的声明性方法,我是否需要管理会话

<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>
如果没有交易,我通常会这样做:

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()或 Spring管理的SqlSession上的SqlSession.close()

因此,当我只是将
@Transaction
注释(以及
配置)添加到方法中时,我怀疑我的操作是否正确

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

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

}
事务管理器是否负责会话资源?或者我必须删除
try-catch
子句


Thk

我向MyIbatis用户组发布了相同的问题。答复很有用:

要使用MyBatis,您需要SqlSesion或Mapper接口。 使用“经典”MyBatis,您可以从 SqlSessionFactory,但在使用Spring时会发生变化

因此,我遵循以下示例: 我向服务类注入了一个sqlSessionTemplate,它在内部负责打开和关闭会话

<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>
戴维德