为什么我们需要一遍遍地编写相同的持久化方法呢,难道仅仅是因为要处理的领域类型不同吗?Spring Data JPA 能够终结这种样板式的愚蠢行为。我们不再需要一遍遍地编写相同的 Repository 实现,Spring Data 能够让我们只编写 Repository 接口就可以了。根本就不再需要实现类了。
此时,SpitterRepository 看上去并没有什么作用。但是,它的功能远超出了表面上所看到的那样。 编写 Spring Data JPA Repository 的关键在于要从一组接口中挑选一个进行扩展。这里,SpitterRepository 扩展了 Spring Data JPA 的 JpaRepository(稍后,我会介绍几个其他的接口)。通过这种方式,JpaRepository 进行了参数化,所以它就能知道这是一个用来持久化 Spitter 对象的 Repository,并且 Spitter 的 ID 类型为 Long。另外,它还会继承 18 个执行持久化操作的通用方法,如保存 Spitter、删除 Spitter 以及根据 ID 查询 Spitter。
此时,你可能会想下一步就该编写一个类实现 SpitterRepository 和它的 18 个方法了。如果真的是这样的话,那本章就会变得乏味无聊了。其实,我们根本不需要编写 SpitterRepository 的任何实现类,相反,我们让 Spring Data 来为我们做这件事请。我们所需要做的就是对它提出要求。
为了要求 Spring Data 创建 SpitterRepository 的实现,我们需要在 Spring 配置中添加一个元素。如下的程序清单展现了在 XML 配置中启用 Spring Data JPA 所需要添加的内容:
很重要的一点在于 Repository 的实现类是在应用启动的时候生成的,也就是 Spring 的应用上下文创建的时候。它并不是在构建时通过代码生成技术产生的,也不是接口方法调用时才创建的。
很漂亮的技术,对吧?
Spring Data JPA 很棒的一点在于它能为 Spitter 对象提供 18 个便利的方法来进行通用的 JPA 操作,而无需你编写任何持久化代码。但是,如果你的需求超过了它所提供的这 18 个方法的话,该怎么办呢?幸好,Spring Data JPA 提供了几种方式来为 Repository 添加自定义的方 法。让我们看一下如何为 Spring Data JPA 编写自定义的查询方法。