首页 文章

Spring JPA中的通用存储库

提问于
浏览
0

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

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

如果是的话,你能分享一个例子吗?

2 回答

  • 0

    是否有一个创建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所描述的简单存储库中 .

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

  • 2

    对于插入/更新/删除操作,此类存储库可能非常简单:

    @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

相关问题