我们正在一个带有大量数据库表的Restful项目。尽管表上的操作几乎相同,并且主要是INSERT / UPDATE / DELETE / FETCH。
我的问题是:
我们是否必须为我们创建的每个实体(Domain类)创建一个存储库(扩展JpaRepository),或者可以选择创建一个GenericRepository来处理所有上述实体的所有功能?
即所有的单一GenericRepository。
如果是,您可以分享一个例子吗?
答案 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