Ваши объекты Entity должны быть простыми старыми объектами, не имеющими зависимостей от платформ или баз данных или других сложностей. >
Как мы видим на диаграмме дяди Боба, интерфейс шлюза (репозитория) связан с объектами домена.

На этом этапе я столкнулся с проблемой, потому что JpaRepositoty работает только с классами с аннотацией @Entity, что больше относится к СУБД, чем к основной бизнес-логике.
Я нашел несколько решений, которые сделают его более «чистым»:
- Создать интерфейс репозитория в домене и на уровне персистентности создайте RepositoryImpl, который будет реализовывать интерфейс домена и будет использовать EntityManager с POJO:
Код: Выделить всё
@Repository
public class DemoRepositoryImpl implements DemoRepository {
@Autowired
private EntityManager entityManager;
@Override
public List findAll() {
Query q = (Query) entityManager.createNativeQuery("SELECT\n" +
" demo.demo_id as demo_id,\n" +
" demo.value as demo_value\n" +
" FROM Demo\n");
List results = q.getResultList();
return results;
}
}
- Создать интерфейс в домене и реализовать пару с помощью JpaRepositoty:
Код: Выделить всё
@Repository
@RequiredArgsConstructor
public class DemoRepositoryImpl implements DemoRepository {
private final JpaDemoRepository jpaDemoRepository;
@Override
public List findAll() {
return jpaDemoRepository.findAll().stream()
.map(entity -> new Customer(entity.getId(), entity.getName()))
.toList();
}
- Создание фиктивного объекта:
Код: Выделить всё
@Entity
@Data
public class BaseEntity {
@Id
private Long id;
}
Код: Выделить всё
public interface EmployeeDao extends JpaRepository {
@Query(value = "select name from employee where employee_number = ?", nativeQuery = true)
Optional get(String employeeNumber);
}
public interface Employee{
String getName();
}
Я не хочу уменьшать эффективность кода с абстрактной «чистотой», но при использовании Hibernate мое приложение сильно привязано к Hibernate и реляционным базам данных. Использование Hibernate внутри домена значительно усложняет переход на другую реализацию JPA, JOOQ или даже NoSQL и полностью разрушает правила чистой архитектуры.
Стоит ли быть независимым от Hibernate и реляционных баз данных в больших проектах ? Существуют ли какие-либо решения, позволяющие не создавать приложение на основе базы данных, а также иметь возможность использовать большинство привилегий JPA?
Подробнее здесь: https://stackoverflow.com/questions/792 ... chitecture
Мобильная версия