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

时间:2014-01-21 17:37:04

标签: java jpa spring-data-jpa spring-data

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

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

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

1 个答案:

答案 0 :(得分:34)

由于存储库是从Domain Driven Design派生的概念,因此考虑数据库表是错误的方法。根据定义,您可以从存储库访问聚合根。有效地,存储库正在模拟这些集合。

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

通常,持久性访问机制应遵循域原则。因此,您将OrderOrder建模为LineItem类,但只创建@Entity,作为聚合根的形式,并有效控制对象内的一致性规则曲线图。

我们强烈建议使用商店特定的存储库基础接口,因为它们 - 顾名思义 - 公开商店细节(例如OrderRepository)到如果可能的话,应该不知道的客户。在我的回答here中阅读更多内容。