spring-data-jpa - 我们如何在 Spring Data JPA 中创建通用存储库?
问题描述
我为实体特定的存储库创建了一个接口,例如:
@Repository
public interface PlayerRepository extends CrudRepository<Player, Long> {
}
有没有办法创建一个通用存储库,这样我就不必为每个 POJO 创建存储库实体,比如:
@Repository
public interface PlayerRepository<T> extends CrudRepository<T, Long> {
}
解决方案
恐怕没有。如果您已经尝试过,您会注意到您的第二个存储库extending CrudRepository<T, Long>
失败并显示如下内容:
调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException:不是托管类型:类 java.lang.Object。
因为使用泛型T
java 只能判断它Object
是不是实体。正因为如此,您需要添加注释@NoRepositoryBean
,然后只允许您使用真实的实体类型而不是 generic 来扩展它T
。
以编程方式可能是可能的,但很可能比仅仅创建 repo 接口要痛苦得多。
如果你有实体继承树,比如A->B->C
你可以为它创建一个 repo ,A
那么也可以处理继承自. 所以你可以发出它,它会返回你所有的 s,s & s,但是作为一个s 的列表,你必须分别检查每个项目的实际类型。B
C
A
findAll()
A
B
C
A
通常,当不需要对实体进行任何特殊处理并且您不想编写那些存储库“存根”时,您可以直接使用EntityManager
。您可以实现自己的通用存储库,例如@Service
具有@Autowired
实体管理器并调用其find(..)
和persist(..)
其他方法的类。
推荐阅读
- python - 部署应用程序时此平台错误不支持 PyTorch 轮
- android - 为什么 MediaPlayer 不阻塞 UI 线程?
- android - 使用不在 Android 的构造函数或工厂中的函数成员将上下文传递给 ViewModel
- html - 为什么滚动时网站内容显示在导航栏上
- javascript - 如何在 HTML 中删除 iOS 键盘上方的“完成”栏?
- c# - 如何创建 OPOS 服务对象虚拟打印机 - c#
- sql - 在 oracle 中提供 SQL 如果在每个名称的 inc 和 dec 列表中找到相同的 id,则冲突列应该是 yes,否则冲突应该显示 no
- android - 数据绑定 XML 表达式在 RecyclerView 项目中无法正常工作
- javascript - 使用过滤器/暗模式观看明亮视频的书签
- javascript - html页面javascript/jQuery的pdf预览