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