使用JPA / Spring的(通用)DDD存储库的方法:它看起来不对吗?
我对DDD和JPA很新。
我正在使用JPA和Spring开发通用存储库。 我非常喜欢文章DDD中公开的方法:通用存储库和JPA实现模式:数据访问对象 。 我的目标是使用JPA和Spring在域驱动设计中构建完美的存储库。
在第一篇文章概念之后,我使用内部通用存储库来尊重域与数据存储的契约 。
public interface IInternalGenericRepository { List read(String query, Object[] params); void persist(E entity); void remove(E entity); } public class InternalGenericRepository implements IInternalGenericRepository { // Injected through DI in Spring @PersistenceContext private EntityManager em; private final Class entityClass; public List read(String query, Object[] params) { Query q = em.createQuery(query); for (int i = 0; i < params.length; i++) { q.setParameter(i + 1, params[i]); } return q.getResultList(); } public void persist(E entity) { em.persist(entity); } // ... }
然后,特定实体(例如:组织)的存储库看起来像这样。
public interface IOrganizationRepository { List organizationByCityName(String city); void create(Organization o); } @Repository public class OrganizationRepository implements IOrganizationRepository { @Autowired IInternalGenericRepository internalRepository; public List organizationByCityName(String city) { Object[] params = new Object[1]; params[0] = city; return internalRepository.read("select o from Organization o where o.city.name like ?1", params); } @Override public void create(Organization o) { internalRepository.persist(o); } }
它看起来是使用JPA和Spring实现DDD Repository的好方法。 然后将OrganizationRepository注入我的服务层。
我希望有外部观点以避免瑕疵或误解。 您如何看待以及如何改进?
谢谢。
编辑:
- @Autowired on internalRepository – 感谢axtavt指出它。
- read()可以改进
首先,它不起作用,因为Spring无法将EntityManager
注入到用new
创建的内部对象中。 所以,你必须写这样的东西:
public class OrganizationRepository implements IOrganizationRepository { @PersistenceContext public void setEntityManager(EntityManager em) { internalRepository.em = em; } ... }
您的read
方法看起来有点过于通用。 它错过了一些重要的用例,例如getSigleResult
和setFirstResult
/ setMaxResults
。
我个人更喜欢第二篇文章apporach,因为使用组合你最终会在OrganizationRepository
中使用EntityManager
来实现在IInternalGenericRepository
遗漏的IInternalGenericRepository
。