您是不是应该在 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 的概念,因此考虑数据库表是错误的方法。根据定义,您可以从存储库访问聚合根。实际上,存储库正在模拟这些的集合。
现在什么形成聚合根?可能更有趣:什么不是?当然,这高度依赖于您的域,但让我在这里举个例子。包含LineItems
的Order
通常被建模为聚合根。这是由于Order
的组成性质。如果没有周围的Order
,LineItem
就不会存在。
通常持久性访问机制应该遵循领域原则。因此,您可以将Order
和LineItem
建模为@Entity
类,但只创建一个OrderRepository
,因为它们形成聚合根并有效地控制对象图中的一致性规则。
我们还强烈建议不要使用商店特定的存储库基础接口,因为它们 - 顾名思义 - 向客户公开商店细节(例如 flush()
)如果可能的话,他们不应该意识到这一点。在我的回答 here 中阅读更多信息。
【讨论】:
如果 LineItem 没有独立于其父实体 Order 的生命周期,我不确定我是否理解您为什么建议将 LineItem 建模为@Entity
。我认为它应该在其定义类 LineItem 中建模为 @Embeddable
而不是 @Entity
。以上是关于您是不是应该在 JPA 中的每个表都有一个存储库?的主要内容,如果未能解决你的问题,请参考以下文章