【问题标题】:Generic Repository in Spring JPASpring JPA 中的通用存储库
【发布时间】:2018-12-03 23:29:50
【问题描述】:

我们正在开发一个包含大量数据库表的 Restful 项目。虽然对表的操作几乎相同,主要是 INSERT/UPDATE/DELETE/FETCH。

我的问题是:
我们是否必须为我们创建的每个实体(域类)创建一个存储库(扩展 JpaRepository),或者可以选择创建一个可以处理所有实体的所有上述功能的 GenericRepository? 即所有人的单个 GenericRepository。

如果是这样,你能分享一个例子吗?

【问题讨论】:

  • Spring Data JPA 旨在与少量实体类型一起使用,为它们快速创建存储库。对于通用类型存储库,您可以创建自己的类,从应用程序上下文中获取 EntityManager 并将插入/更新/删除方法委托给其 .persist().merge().remove() 方法
  • 非常感谢您为我解惑。
  • 关于每个实体都有一个存储库:stackoverflow.com/questions/21265262/…

标签: spring spring-data-jpa repository-pattern spring-rest


【解决方案1】:

对于插入/更新/删除操作,这样的存储库可能很简单:

@Component
public class CommonRepository {

  @PersistenceContext
  EntityManager em;

  @Transactional
  public <E> E insert(E entity) {
     em.persist(entity);
     return entity;
  }

  @Transactional
  public <E> E update(E entity) {
     return em.merge(entity);
  }

  @Transactional
  public void delete(Object entity) {
     em.remove(entity);
  }

}

更准确的代码,参考SimpleJpaRepository implementation

【讨论】:

    【解决方案2】:

    [那里] 是否可以创建一个GenericRepository 来处理所有实体的所有上述功能?

    您正在以错误的假设看待这个问题:您实际上不应该为每个表/实体拥有一个存储库,而是每个聚合(根)。详情请见Are you supposed to have one repository per table in JPA?

    第二:拥有一个通用存储库有点违背 Spring Data JPA 的目的,毕竟 JPA 已经有一个通用存储库。它被称为EntityManager。因此,如果您只需要您提到的操作,只需注入 EntityManager 就可以了。根本不需要使用 Spring Data JPA。如果你想在你的业务代码和 JPA 细节之间有一些东西,你可以将它包装在一个简单的存储库中,如 @AlexSalauyou 所述。

    最后一点:您将拥有在某处创建所有表的代码。您还将拥有所有实体的代码。你有测试这个的代码。为每个接口定义一个简单的接口会成为问题吗?

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 2016-01-19
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2019-08-02
      相关资源
      最近更新 更多