- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
11.3.3 混合自定义的功能
有些时候,我们需要Repository所提供的功能是无法用Spring Data的方法命名约定来描述的,甚至无法用@Query注解设置查询来实现。尽管Spring Data JPA非常棒,但是它依然有其局限性,可能需要我们按照传统的方式来编写Repository方法:也就是直接使用EntityManager。当遇到这种情况的时候,我们是不是要放弃Spring Data JPA,重新按照11.2.2小节中的方式来编写Repository呢?
简单来说,是这样的。如果你需要做的事情无法通过Spring Data JPA来实现,那就必须要在一个比Spring Data JPA更低的层级上使用JPA。好消息是我们没有必要完全放弃Spring Data JPA。我们只需在必须使用较低层级JPA的方法上,才使用这种传统的方式即可,而对于Spring Data JPA知道该如何处理的功能,我们依然可以通过它来实现。
当Spring Data JPA为Repository接口生成实现的时候,它还会查找名字与接口相同,并且添加了Impl后缀的一个类。如果这个类存在的话,Spring Data JPA将会把它的方法与Spring Data JPA所生成的方法合并在一起。对于SpitterRepository接口而言,要查找的类名为SpitterRepositoryImpl。
为了阐述该功能,假设我们需要在SpitterRepository中添加一个方法,发表Spittle数量在10,000及以上的Spitter将会更新为Elite状态。使用Spring Data JPA的方法命名约定或使用@Query均没有办法声明这样的方法。最为可行的方案是使用如下的eliteSweep()方法。
程序清单11.6 将活跃的Spitter用户升级为Elite状态的Repository方法
我们可以看到,eliteSweep()方法与之前在11.2.2小节中所创建的Repository方法并没有太大的差别。SpitterRepositoryImpl没有什么特殊之处,它使用被注入的EntityManager来完成预期的任务。
注意,SpitterRepositoryImpl并没有实现SpitterRepository接口。Spring Data JPA负责实现这个接口。SpitterRepositoryImpl(将它与Spring Data的Repository关联起来的是它的名字)实现了SpitterSweeper接口,它如下所示:
我们还需要确保eliteSweep()方法会被声明在SpitterRepository接口中。要实现这一点,避免代码重复的简单方式就是修改SpitterRepository,让它扩展SpitterSweeper:
如前所述,Spring Data JPA将实现类与接口关联起来是基于接口的名称。但是,Impl后缀只是默认的做法,如果你想使用其他后缀的话,只需在配置@EnableJpa-Repositories的时候,设置repositoryImplementationPostfix属性即可:
如果在XML中使用<jpa:repositories>元素来配置Spring Data JPA的话,我们可以借助repository-impl-postfix属性指定后缀:
我们将后缀设置成了Helper,Spring Data JPA将会查找名为SpitterRepository-Helper的类,用它来匹配SpitterRepository接口。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论