Я новичок в DDD и JPA.
Я работаю над общим репозиторием с JPA и Spring. Мне очень нравятся подходы, изложенные в статьях DDD: Общий репозиторий и Шаблоны реализации JPA: объекты доступа к данным. Моя цель — создать идеальный репозиторий в доменно-ориентированном дизайне с помощью JPA и Spring.
Я использую внутренний общий репозиторий, чтобы соблюдать контракт домена с хранилищем данных, следуя принципам первой статьи.
public interface IInternalGenericRepository<K, E> {
List<E> read(String query, Object[] params);
void persist(E entity);
void remove(E entity);
}
public class InternalGenericRepository<K, E> implements IInternalGenericRepository<K, E> {
// Injected through DI in Spring
@PersistenceContext
private EntityManager em;
private final Class<E> entityClass;
public List<E> 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<Organization> organizationByCityName(String city);
void create(Organization o);
}
@Repository
public class OrganizationRepository implements IOrganizationRepository {
@Autowired
IInternalGenericRepository<Long, Organization> internalRepository;
public List<Organization> 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);
}
}
Похоже, это хороший способ реализовать репозиторий DDD с помощью JPA и Spring. Затем OrganizationRepository внедряется в мой уровень сервисов.
Я хотел бы иметь внешние взгляды, чтобы избежать недостатков или неправильного понимания. Что вы думаете и как его можно улучшить?
Спасибо.
Изменить:
- @Autowired во внутреннем репозитории - спасибо axtavt за указание.
- read() можно улучшить