在 Spring Data 的 M2 之前,我们要求用户扩展JpaRepository
,原因如下:
- 类路径扫描基础架构只选择扩展该接口的接口,因为可能会并行使用 Spring Data JPA 和 Spring Data Mongo,并且它们都指向同一个包,因此不清楚要为哪个存储创建代理。然而,自从 RC1 以来,我们只是将这个负担留给了开发人员,因为我们认为这是一个相当奇特的案例,并且仅使用
Repository
,CrudRepository
或类似的好处超过了您在刚刚描述的极端案例中所付出的努力。您可以使用命名空间中的exclude
和include
元素来对此进行更细粒度的控制。
- 在 M2 之前,我们通过重新声明 CRUD 方法并用
@Transactional
. 这个决定反过来是由AnnotationTransactionAttributeSource
用于查找事务配置的算法驱动的。因为我们希望通过在具体的存储库接口中重新声明一个 CRUD 方法并应用@Transactional
它来为用户提供重新配置事务的可能性。对于 RC1,我们决定实现一个自定义TransactionAttributeSource
,以便能够将注释移回存储库 CRUD 实现。
长话短说,这就是它归结为:
从 RC1 开始,不再需要扩展特定于商店的存储库接口,除非您想……</p>
- 在更核心的存储库接口中使用
List
-based 访问findAll(…)
而不是-based 访问Iterable
(尽管您可以简单地在公共基本接口中重新声明相关方法以返回List
s )
- 您想使用 JPA 特定的方法
saveAndFlush(…)
,诸如此类。
一般来说,自 RC1 以来,您在 CRUD 方法的公开方面更加灵活,因为您甚至可以仅扩展Repository
标记接口并有选择地添加您想要公开的 CRUD 方法。由于支持实现仍将实现所有方法,PagingAndSortingRepository
我们仍然可以将调用路由到实例:
public interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
List<T> findAll();
T findOne(ID id);
}
public interface UserRepository extends MyBaseRepository<User, Long> {
List<T> findByUsername(String username);
}
在该示例中,我们定义MyBaseRepository
为仅公开findAll()
和findOne(…)
(将被路由到实现 CRUD 方法的实例中)以及向两个 CRUD 方法添加 finder 方法的具体存储库。
有关该主题的更多详细信息,请参阅参考文档。