Spring JPA中的通用存储库

时间:2018-06-25 11:39:30

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

我们正在一个带有大量数据库表的Restful项目。尽管表上的操作几乎相同,并且主要是INSERT / UPDATE / DELETE / FETCH。

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

如果是,您可以分享一个例子吗?

2 个答案:

答案 0 :(得分:2)

  

[存在]创建GenericRepository来处理所有实体的所有上述功能的选项吗?

您正以错误的假设来考虑此问题:实际上,您实际上不应该针对每个表/实体拥有一个存储库,而应针对每个Aggregate(Root)拥有一个存储库。有关更多详细信息,请参见Are you supposed to have one repository per table in JPA?

第二:拥有通用存储库违反了Spring Data JPA的目的,毕竟,JPA已经拥有通用存储库。它称为EntityManager。因此,如果您只需要提到的操作,则只需注入EntityManager就可以了。完全不需要使用Spring Data JPA。而且,如果您希望在业务代码和JPA规范之间包含一些内容,可以将其包装在@AlexSalauyou描述的简单存储库中。

最后一点:您将拥有在某个地方创建所有表的代码。您还将拥有所有实体的代码。并且您有用于测试此代码。每个接口都有琐碎的接口定义会成为问题吗?

答案 1 :(得分:0)

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

@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