Spring Data JPA配置事务失效问题解决
来源:互联网 发布:linux搜狗输入法 编辑:程序博客网 时间:2024/05/24 02:14
最近在写自己的一个应用小项目时,ORM采用了Spring Data JPA,项目运行起来之初一些正常。但测试到事务的时候出现事务失效问题,后来查出是配置问题,问题出在采用<context:component-scan>扫描项目类时,未处理好组件范围的处理。
下面记录一下整个问题解决过程,权当笔记,希望能帮到遇到类似问题的同学:
首先贴出一下我的JPA配置
视图层配置
此配置单表操作正常,为测试事务有效性,人为在业务层组件中抛出运行时异常,
@Override
@Transactional
public ApiResult saveUser(SysUser sysUser) {
SysRole role = new SysRole();
role.setRoleName("Role1");
role.setSort(1);
sysRoleRepository.save(role);
if (role.getRoleId() < 0) //此处人为产生运行时异常
throw new RuntimeException("save role failure!");
sysUserRepository.save(sysUser);
if (sysUser.getUserId() > 0) {
throw new RuntimeException("save user failure!");
}
return new ApiResult(ApiResult.SUCC, "save successful");
}
其实在视图层配置项中我也将@Controller层进行了排除,但事务依旧失效。很奇怪。
再观察数据库时发现角色表数据已经添加了一条记录,但用户表数据未插入成功,事务失败!
发现这种情况其实在采用spring注解的项目中比较常见,是在配置的时候未在意组件扫描范围引起。在spring先扫描@Service及@Component组件后,再扫描@Controller时范围过大。处理方式也非常简单。只需要在扫描@Controller组件时避免再次扫描@Service及@Repository即可。
将视图层稍加修改一下(红色斜体部分):
<context:component-scan base-package="com.itnews.android.modules" [b]use-default-filters="false"[/b][i][color=#FF0000][/color][/i]>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
加上此配置后,再运行,则可以发现事务正常。
加上这处配置的作用是关闭默认对@Service及@Component的子注解@Service、@Reposity扫描。
下面记录一下整个问题解决过程,权当笔记,希望能帮到遇到类似问题的同学:
首先贴出一下我的JPA配置
视图层配置
此配置单表操作正常,为测试事务有效性,人为在业务层组件中抛出运行时异常,
@Override
@Transactional
public ApiResult saveUser(SysUser sysUser) {
SysRole role = new SysRole();
role.setRoleName("Role1");
role.setSort(1);
sysRoleRepository.save(role);
if (role.getRoleId() < 0) //此处人为产生运行时异常
throw new RuntimeException("save role failure!");
sysUserRepository.save(sysUser);
if (sysUser.getUserId() > 0) {
throw new RuntimeException("save user failure!");
}
return new ApiResult(ApiResult.SUCC, "save successful");
}
其实在视图层配置项中我也将@Controller层进行了排除,但事务依旧失效。很奇怪。
再观察数据库时发现角色表数据已经添加了一条记录,但用户表数据未插入成功,事务失败!
发现这种情况其实在采用spring注解的项目中比较常见,是在配置的时候未在意组件扫描范围引起。在spring先扫描@Service及@Component组件后,再扫描@Controller时范围过大。处理方式也非常简单。只需要在扫描@Controller组件时避免再次扫描@Service及@Repository即可。
将视图层稍加修改一下(红色斜体部分):
<context:component-scan base-package="com.itnews.android.modules" [b]use-default-filters="false"[/b][i][color=#FF0000][/color][/i]>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
加上此配置后,再运行,则可以发现事务正常。
加上这处配置的作用是关闭默认对@Service及@Component的子注解@Service、@Reposity扫描。
0 0
- Spring Data JPA配置事务失效问题解决
- Spring Data JPA事务失效问题
- Spring Data Jpa 自带事务配置
- spring data jpa 事务控制
- spring data JPA 配置
- spring data JPA 配置
- spring data jpa 配置
- Spring Data JPA配置
- Spring Data Jpa 配置
- Spring Data JPA,事务导致的异常
- Spring Data Jpa 简单使用事务
- Spring Data JPA环境配置
- Spring data jpa配置出错
- Spring Data JPA + JNDI配置
- spring data jpa 的配置
- 跟着问题学习Spring Data Jpa----Spring Data Jpa配置
- spring-data-jpa+spring+hibernate+druid配置
- spring data jpa 中的OpenEntityManagerInViewFilter 取代OpenSessionInViewFilter 放置session失效
- HTMLPARSER学习小结(二)
- c++ class类成员用指针还是用普通变量认识
- 跨交换机VLAN通信 / 单臂路由VLAN通信
- Git创建版本库及从远程库克隆
- ARM Trustzone
- Spring Data JPA配置事务失效问题解决
- 查看ocx控件CLSID的方法
- Android 仿美团网,大众点评购买框悬浮效果
- Date类型数据的前端js显示
- Linux常用命令之whereis,which,find和grep命令
- Nginx查看并发链接数(界面和命令)
- Alret展示 +Flex 录音 && 播放录音
- 获取json串中的值
- Redis数据过期策略探究