java-如何在mybatis-spring中使用@Transactional批注?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何在mybatis-spring中使用@Transactional批注?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3963字,纯文字阅读大概需要6分钟。
内容图文
![java-如何在mybatis-spring中使用@Transactional批注?](/upload/InfoBanner/zyjiaocheng/684/b152b8fbda5f40d7a5484277ec28b563.jpg)
我尝试使用mybatis-spring依赖项在spring和mybatis中使用@Transactional批注.这是服务层.
@Service
public class OracleService {
@Autowired
private TestMapper mapper;
@Autowired
private PlatformTransactionManager transactionManager;
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = Exception.class,
value = "transactionManager")
void insert1() {
TestModel testModel = new TestModel(1, "title1", "content1");
mapper.insert(testModel);
throw new RuntimeException();
}
}
如您所见,在insert1()中抛出了RuntimeException,因此插入操作应该失败.但实际上,事实并非如此.记录已成功插入.为什么?
这是我的主要方法.
public class Launcher {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("spring-config.xml");
OracleService oracleService = cxt.getBean(OracleService.class);
try {
oracleService.insert1();
} catch(Exception e) {
System.out.println("Exception occurred!");
}
}
}
弹簧配置.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="com.database.learn"/>
<bean id="oracleDataSource" class="oracle.jdbc.pool.OracleDataSource">
<property name="URL" value="OracleJdbcUrl"/>
<property name="user" value="user"/>
<property name="password" value="password"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="oracleDataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="oracleDataSource" />
</bean>
<bean id="testMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.database.learn.TestMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
我在pom.xml中使用了以下依赖项
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
解决方法:
正如@ M.Deinum提到的那样,我必须公开应用@Transactional的方法,换句话说,我必须更改
@Transactional(propagation = Propagation.REQUIRED)
void insert1() {
TestModel testModel = new TestModel(1, "title1", "content1");
mapper.insert(testModel);
throw new RuntimeException();
}
至
@Transactional(propagation = Propagation.REQUIRED)
public void insert1() {
TestModel testModel = new TestModel(1, "title1", "content1");
mapper.insert(testModel);
throw new RuntimeException();
}
原因写在spring文档中.
Method visibility and @Transactional
When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.
内容总结
以上是互联网集市为您收集整理的java-如何在mybatis-spring中使用@Transactional批注?全部内容,希望文章能够帮你解决java-如何在mybatis-spring中使用@Transactional批注?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。