首页 > 解决方案 > 我们如何在 Spring Data JPA 中创建通用存储库?

问题描述

我为实体特定的存储库创建了一个接口,例如:

@Repository
public interface PlayerRepository extends CrudRepository<Player, Long> {
}

有没有办法创建一个通用存储库,这样我就不必为每个 POJO 创建存储库实体,比如:

@Repository
public interface PlayerRepository<T> extends CrudRepository<T, Long> {
}

标签: spring-data-jpaspring-data

解决方案


恐怕没有。如果您已经尝试过,您会注意到您的第二个存储库extending CrudRepository<T, Long>失败并显示如下内容:

调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException:不是托管类型:类 java.lang.Object。

因为使用泛型Tjava 只能判断它Object是不是实体。正因为如此,您需要添加注释@NoRepositoryBean,然后只允许您使用真实的实体类型而不是 generic 来扩展它T

以编程方式可能是可能的,但很可能比仅仅创建 repo 接口要痛苦得多。

如果你有实体继承树,比如A->B->C你可以为它创建一个 repo ,A那么也可以处理继承自. 所以你可以发出它,它会返回你所有的 s,s & s,但是作为一个s 的列表,你必须分别检查每个项目的实际类型。BCAfindAll()ABCA

通常,当不需要对实体进行任何特殊处理并且您不想编写那些存储库“存根”时,您可以直接使用EntityManager。您可以实现自己的通用存储库,例如@Service具有@Autowired实体管理器并调用其find(..)persist(..)其他方法的类。


推荐阅读