我为实体特定的存储库创建了一个接口,例如:
@Repository
public interface PlayerRepository extends CrudRepository<Player, Long> {
}
有没有办法创建通用存储库,这样我就不必为每个POJO创建存储库实体了,
@Repository
public interface PlayerRepository<T> extends CrudRepository<T, Long> {
}
答案 0 :(得分:1)
恐怕不是。如果您已经尝试过,您会注意到第二个存储库extending CrudRepository<T, Long>
失败,并显示以下内容:
调用init方法失败;嵌套的异常是java.lang.IllegalArgumentException:不是托管类型:类java.lang.Object。
因为使用通用T
,Java只能说它是Object
,而不是实体。因此,您需要添加注释@NoRepositoryBean
,然后仅允许您使用真实实体类型而不是通用T
对其进行扩展。
可能可以通过编程实现,但是最可能比创建回购接口要痛苦得多。
如果您拥有A->B->C
之类的实体继承树,则可以为A
创建一个存储库,然后再处理B
和C
从{继承的属性{1}}。因此,您可以发出A
,它将返回给您所有findAll()
,A
和B
,但作为C
的列表,您将拥有分别检查每个项目的实际类型。
通常,当不需要对实体进行任何特殊处理并且您不想编写那些存储库“存根”时,可以直接使用A
。您可以实现自己的通用存储库,例如具有EntityManager
实体管理器的@Service
类,并调用其@Autowired
,find(..)
和其他方法。