您是不是应该在 JPA 中的每个表都有一个存储库?

Posted

技术标签:

【中文标题】您是不是应该在 JPA 中的每个表都有一个存储库?【英文标题】:Are you supposed to have one repository per table in JPA?您是否应该在 JPA 中的每个表都有一个存储库? 【发布时间】:2014-02-11 11:14:04 【问题描述】:

您是否应该在 JPA 中为每个表创建一个存储库?如果不是,如何解析存储库数据库中的泛型?

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

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

【问题讨论】:

【参考方案1】:

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

现在什么形成聚合根?可能更有趣:什么不是?当然,这高度依赖于您的域,但让我在这里举个例子。包含LineItemsOrder 通常被建模为聚合根。这是由于Order 的组成性质。如果没有周围的OrderLineItem 就不会存在。

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

我们还强烈建议不要使用商店特定的存储库基础接口,因为它们 - 顾名思义 - 向客户公开商店细节(例如 flush())如果可能的话,他们不应该意识到这一点。在我的回答 here 中阅读更多信息。

【讨论】:

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

以上是关于您是不是应该在 JPA 中的每个表都有一个存储库?的主要内容,如果未能解决你的问题,请参考以下文章

在每个模型的不同 DAL 类中实现 JPA 存储库方法时如何避免重复的代码行/代码块

spring data jpa中的存储是啥?

每个表都应该有一个主键吗?

减少存储库以聚合根

每个“容器”类一个 DAO 还是每个表一个 DAO?

(MySQL常用语法大总结(复习篇)