篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring jpa使用@service注解时失效该如何解决?相关的知识,希望对你有一定的参考价值。
在jeesite中引入一个简单的spring data jpa 项目,运行时总是提示No bean named 'countryService' is defined,即我的@Service( 'countryService')注解失效了,求助这是什么原因?
那就是没有扫描到文件,看看打包后里面包路径是不是spring扫描的包路径,项目运行时打包成jar的项目相当于把这个压缩包里面的东西解压到classes里面。
Spring 框架对 JPA 提供的支持主要体现在如下几个方面:
首先它使得 JPA 配置变得更加灵活。
JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中。该文件通常包含了初始化 JPA 引擎所需的全部信息。Spring 提供的 LocalContainerEntityManagerFactoryBean 提供了非常灵活的配置,persistence.xml 中的信息都可以在此以属性注入的方式提供。
其次Spring 实现了部分在 EJB 容器环境下才具有的功能。
比如对 @PersistenceContext、@PersistenceUnit 的容器注入支持。
第三,Spring 将 EntityManager 的创建与销毁、事务管理等代码抽取出来,并由其统一管理。
4.开发者不需要关心这些,业务方法中只剩下操作领域对象的代码,事务管理和 EntityManager 创建、销毁的代码都不再需要开发者关心了。
在项目中发现事务失效,使用@Transactional
注解标注的Service
业务层实现类方法全部不能回滚事务了,最终发现使用因为Spring与shiro进行整合之后导致的问题,将所有的Service
层实现类都添加如下注解
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS)
将代理方式换成CGLib
的代理方式之后得以解决,最终不明原因,如有看到这篇博客并知道答案的朋友请留言告知
如果事务不能回滚,也需要考虑如下几点:
- 表得存储引擎为
MyISAM
是没有事务的,需要使用InnoDB
- 加事务的方法中手动
try...catch
住了异常,只有将异常抛出来(无论是主动还是被动)事务才能回滚
- Spring事务默认回滚的是
RunTimeException
运行时异常,如果是check
异常是不会回滚的,可以指定回滚异常,如下
@Transactional(rollbackFor = Exception.class)
只要出现异常就进行回滚