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

use*_*123 30 java jpa spring-data spring-data-jpa

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

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

@Repository
public interface StoreRepository extends JpaRepository<Store, String> {
    public Store findByGuid(String guid);
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*ohm 37

由于存储库是源自域驱动设计的概念,因此考虑数据库表是错误的方法.根据定义,您可以从存储库访问聚合根.有效地,存储库正在模拟这些集合.

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

通常,持久性访问机制应遵循域原则.因此,你都建模OrderLineItem作为@Entity类,但仅创建一个OrderRepository,作为表单的聚合根和有效地控制对象图内的一致性规则.

我们还强烈建议不要使用特定于商店的存储库基本接口,因为它们 - 顾名思义 - 将商店细节(例如flush())暴露给客户端,如果可能的话,应该不知道.阅读我的回答更多的是在这里.

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