我目前正在进行一个已经实现mybatis的项目。由于这是一个遗留代码,因此使用实现
- 弹簧
- Mybatis
- JAxrs
Spring应用程序上下文文件
<bean id="sqlSessionFactory" class="com.ca.aa.ui.framework.common.mybatis.SqlSessionFactoryBeanWrapper">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:ibatis/*_mapper.xml" />
</bean>
应用程序上下文中引用了另一个xml文件
<bean class="org.mybatis.spring.mapper.MapperFactoryBean" name="tenantDAO">
<property name="mapperInterface" value="com.ca.ias.data.dao.TenantDAO" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
TenantDAO.java
public interface TenantDAO {
public List<something> somemethod1();
}
然后有一个服务层访问上面的java类,然后持久化对象
<bean id="issuerService" class="com.ca.ias.admin.service.IssuerServiceImpl">
<property name="tenantDAO" ref="tenantDAO"/>
</bean>
有一个简单的java方法,它调用tenantDAO,然后持久化对象。
IssuerServiceImpl.java
public void insert(){
try{
tenantDao.insert();
}catch(Exception e){
}finally{
}
我如何在这里实现事务管理器,请帮忙?
有很多方法可以做到这一点,特别是在您已经配置了spring的情况下。基本上你需要配置两件事
- 交易管理器
- 事务边界
交易管理器
您需要在spring上下文中定义事务管理器。根据sqlSessionFactory
定义中提到的dataSource
的来源,它可能会有所不同。很可能你在项目中使用了连接池,也就是说你有一些连接池的配置,比如:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
如果是这种情况,那么您需要将这样的配置添加到spring上下文中
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
交易边界
最简单的方法是使用注释驱动的事务划分。
然后你需要先启用它:
<tx:annotation-driven transaction-manager="txManager"/>
使用此配置,您可以使用Transactional
注释来标记服务中的方法:
@Transactional
public void insert(){
}
@Transactional(readOnly=true)
public void find(){
}