【问题标题】: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);
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果 LineItem 没有独立于其父实体 Order 的生命周期,我不确定我是否理解您为什么建议将 LineItem 建模为 @Entity。我认为它应该在其定义类 LineItem 中建模为 @Embeddable 而不是 @Entity
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 2012-06-20
    • 2010-10-24
    • 1970-01-01
    • 2010-09-12
    • 2019-06-13
    • 2020-01-14
    相关资源
    最近更新 更多