【问题标题】:How do we create a generic repository in Spring Data JPA?我们如何在 Spring Data JPA 中创建通用存储库?
【发布时间】:2019-08-07 05:02:55
【问题描述】:
我已经为实体特定的存储库创建了一个接口,例如:
@Repository
public interface PlayerRepository extends CrudRepository<Player, Long> {
}
有没有办法创建一个通用存储库,这样我就不必为每个 POJO 创建存储库实体,比如:
@Repository
public interface PlayerRepository<T> extends CrudRepository<T, Long> {
}
【问题讨论】:
标签:
spring-data-jpa
spring-data
【解决方案1】:
恐怕不会。如果您已经尝试过,您会注意到您的第二个存储库 extending CrudRepository<T, Long> 失败并显示如下内容:
init 方法调用失败;嵌套异常是 java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object.
因为泛型T java 只能判断它是一个Object,它不是一个实体。因此,您需要添加注解 @NoRepositoryBean,它只允许您使用真实的实体类型而不是通用的 T 来扩展它。
以编程方式可能是可行的,但很可能比仅仅创建 repo 接口要痛苦得多。
如果你有像A->B->C 这样的实体继承树,你可以为A 创建一个repo,然后处理B 和C 从A 继承的属性。因此,您可以发出findAll(),它会返回所有As、Bs 和Cs,但作为As 的列表,您必须分别检查每个项目的实际类型。
通常当不需要对实体进行任何特殊处理并且您不想编写那些存储库“存根”时,您可以直接使用EntityManager。您可以实现自己的通用存储库,例如具有@Autowired 实体管理器的@Service 类,并调用其find(..)、persist(..) 和其他方法。