Как сохранить функцию FetchType.Lazy в спящем режиме с помощью чистой архитектуры?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как сохранить функцию FetchType.Lazy в спящем режиме с помощью чистой архитектуры?

Сообщение Anonymous »

В соответствии с чистой архитектурой:

Ваши объекты 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();
}
Однако они уродливы и лишены некоторых функций JPA, особенно FetchType.Lazy.
Я не хочу уменьшать эффективность кода с абстрактной «чистотой», но при использовании Hibernate мое приложение сильно привязано к Hibernate и реляционным базам данных. Использование Hibernate внутри домена значительно усложняет переход на другую реализацию JPA, JOOQ или даже NoSQL и полностью разрушает правила чистой архитектуры.
Стоит ли быть независимым от Hibernate и реляционных баз данных в больших проектах ? Существуют ли какие-либо решения, позволяющие не создавать приложение на основе базы данных, а также иметь возможность использовать большинство привилегий JPA?

Подробнее здесь: https://stackoverflow.com/questions/792 ... chitecture
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»