您是否应该在JPA中为每个表创建一个存储库?

您是否应该在JPA中为每个表创建一个存储库? 如果没有,您如何解决存储库数据库中的generics?

例如,下面是StoreRepository 。 它处理Store对象上的CRUD操作。 如果我希望存储库也保存StoreEvent对象,我将如何更改下面的接口以容纳这两个对象?

 @Repository public interface StoreRepository extends JpaRepository { public Store findByGuid(String guid); } 

由于存储库是源自域驱动设计的概念,因此考虑数据库表是错误的方法。 根据定义,您可以从存储库访问聚合根。 有效地,存储库正在模拟这些集合。

现在形成聚合根的是什么? 可能更有趣:什么不是? 这当然在很大程度上取决于您的域名,但我在这里举个例子。 包含LineItemsOrder通常被建模为聚合根。 这是由于Order的组成性质。 没有周围的Order LineItem就不存在。

通常,持久性访问机制应遵循域原则。 因此,您将OrderLineItem建模为@Entity类,但只创建OrderRepository ,作为聚合根的forms,并有效地控制对象图中的一致性规则。

我们还强烈建议不要使用特定于商店的存储库基本接口,因为它们 – 顾名思义 – 将商店细节(例如flush() )公开给客户端,如果可能的话,应该不知道。 在我的答案中阅读更多内容。