您是否应该在JPA中为每个表创建一个存储库?
您是否应该在JPA中为每个表创建一个存储库? 如果没有,您如何解决存储库数据库中的generics?
例如,下面是StoreRepository
。 它处理Store
对象上的CRUD操作。 如果我希望存储库也保存StoreEvent
对象,我将如何更改下面的接口以容纳这两个对象?
@Repository public interface StoreRepository extends JpaRepository { public Store findByGuid(String guid); }
由于存储库是源自域驱动设计的概念,因此考虑数据库表是错误的方法。 根据定义,您可以从存储库访问聚合根。 有效地,存储库正在模拟这些集合。
现在形成聚合根的是什么? 可能更有趣:什么不是? 这当然在很大程度上取决于您的域名,但我在这里举个例子。 包含LineItems
的Order
通常被建模为聚合根。 这是由于Order
的组成性质。 没有周围的Order
LineItem
就不存在。
通常,持久性访问机制应遵循域原则。 因此,您将Order
和LineItem
建模为@Entity
类,但只创建OrderRepository
,作为聚合根的forms,并有效地控制对象图中的一致性规则。
我们还强烈建议不要使用特定于商店的存储库基本接口,因为它们 – 顾名思义 – 将商店细节(例如flush()
)公开给客户端,如果可能的话,应该不知道。 在我的答案中阅读更多内容。