我们如何在Spring Data JPA中创建通用存储库?

时间:2019-03-16 06:28:12

标签: spring-data-jpa spring-data

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  

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

因为使用通用T,Java只能说它是Object,而不是实体。因此,您需要添加注释@NoRepositoryBean,然后仅允许您使用真实实体类型而不是通用T对其进行扩展。

可能可以通过编程实现,但是最可能比创建回购接口要痛苦得多。

如果您拥有A->B->C之类的实体继承树,则可以为A创建一个存储库,然后再处理BC从{继承的属性{1}}。因此,您可以发出A,它将返回给您所有findAll()AB,但作为C的列表,您将拥有分别检查每个项目的实际类型。

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