【问题标题】: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&lt;T, Long&gt; 失败并显示如下内容:

init 方法调用失败;嵌套异常是 java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object.

因为泛型T java 只能判断它是一个Object,它不是一个实体。因此,您需要添加注解 @NoRepositoryBean,它只允许您使用真实的实体类型而不是通用的 T 来扩展它。

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

如果你有像A-&gt;B-&gt;C 这样的实体继承树,你可以为A 创建一个repo,然后处理BCA 继承的属性。因此,您可以发出findAll(),它会返回所有As、Bs 和Cs,但作为As 的列表,您必须分别检查每个项目的实际类型。

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

【讨论】:

    猜你喜欢
    • 2019-04-03
    • 2012-04-12
    • 2018-06-15
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2021-01-28
    相关资源
    最近更新 更多