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

60

在JPA中,每个表格是否应该有一个存储库?如果不是,那么如何解决存储库数据库中的通用性问题?

例如,下面是一个StoreRepository。它处理CRUD操作Store对象。如果我还想让存储库保存StoreEvent对象,我该如何更改下面的接口以适应这两个对象?

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

几乎重复:https://dev59.com/-lkT5IYBdhLWcg3wefbR - Jens Schauder
1个回答

67

作为一个从领域驱动设计中得出的概念,考虑数据库表是错误的。根据定义,您从存储库访问聚合根。实际上,存储库模拟了这些对象的集合。

现在,什么构成了聚合根?可能更有趣的是:什么不是聚合根?当然,这高度取决于您的领域,但让我在这里给您举个例子。包含LineItemsOrder通常被建模为聚合根。这是由于Order的组合性质所致。没有周围的Order,就不会存在LineItem

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

我们强烈建议不要使用特定于存储库的基本接口,因为它们 - 如名称所示 - 暴露了存储库的细节(例如flush())给客户端,如果可能的话,客户端不应该知道。在我的答案here中阅读更多相关内容。

2
我不确定我理解你为什么建议将LineItem建模为@Entity,如果它没有独立于其父实体Order的生命周期。我认为它应该在其定义类LineItem中建模为@Embeddable,而不是@Entity - Farrukh Najmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接