当我使用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
子句。
谢谢
答案 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