我们正在开发一个包含大量数据库表的Restful项目 . 虽然表上的操作几乎相同,主要是INSERT / UPDATE / DELETE / FETCH .
我的问题是:我们是否必须为我们创建的每个实体(Domain类)创建一个存储库(扩展JpaRepository),或者可以选择创建一个GenericRepository来处理所有实体的所有上述功能?即所有人的单一GenericRepository .
如果是的话,你能分享一个例子吗?
是否有一个创建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所描述的简单存储库中 .
EntityManager
最后一点:您将拥有在某处创建所有表的代码 . 您还将获得所有实体的代码 . 你有测试这个的代码 . 是否有一个简单的接口定义每个都会成为一个问题?
对于插入/更新/删除操作,此类存储库可能非常简单:
@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 回答
您正在考虑这个错误的假设:您实际上不应该为每个表/实体设置一个存储库,而是根据Aggregate(Root) . 有关详细信息,请参阅Are you supposed to have one repository per table in JPA? .
第二:有一个通用的存储库类型违反了Spring Data JPA的目的,毕竟JPA已经有了一个通用的存储库 . 它被称为
EntityManager
. 所以如果你只需要你提到的操作,只需注入EntityManager
应该没问题 . 根本不需要使用Spring Data JPA . 如果您希望在业务代码和JPA细节之间拥有某些内容,则可以将其包装在@AlexSalauyou所描述的简单存储库中 .最后一点:您将拥有在某处创建所有表的代码 . 您还将获得所有实体的代码 . 你有测试这个的代码 . 是否有一个简单的接口定义每个都会成为一个问题?
对于插入/更新/删除操作,此类存储库可能非常简单:
要获得更准确的代码,请参阅SimpleJpaRepository implementation