JPA Чистая архитектура - PullRequest
       9

JPA Чистая архитектура

0 голосов
/ 30 сентября 2018

im Рефакторинг микросервиса в соответствии с «Чистой архитектурой»:

enter image description here

Каркасы должны быть максимально возможными.Поэтому я использовал шаблон адаптера и инверсию зависимости, чтобы поместить org.springframework.data.repository.CrudRepository в самый верхний слой.Но как я могу использовать @Entity (из J ava P ersistence A PI) для сохранения моих сущностей, если Entites находятся в центре, а Frameworks находятся наМаксимальный слой?


Пример: Демо-объект:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
public class Demo implements Serializable {
    @Id
    @GeneratedValue
    private long id;
    
    @NotNull
    private String foo;

}

GenericRepostioryInterface (в слое Usecase)

public interface CrudRepositoryInterface<S,T> {
    public <U extends S> U save(U u) ;    
    public <U extends S> Iterable<U> saveAll(Iterable<U> itrbl) ;    
    public Optional<S> findById(T id) ;    
    public boolean existsById(T id) ;    
    public Iterable<S> findAll() ;    
    public Iterable<S> findAllById(Iterable<T> itrbl) ;    
    public long count() ;    
    public void deleteById(T id) ;    
    public void delete(S t);    
    public void deleteAll(Iterable<? extends S> itrbl) ;    
    public void deleteAll() ;  
}

Некоторые варианты использования:

    @Autowired
    private CrudRepositoryInterface<Demo,Long> demoRepository;
    ...
    
    private void deleteAll(){
      this.demoRepository.deleteAll();
    }
    ...

Адаптер (уровень БД)

public interface DemoRepositoryAdapter extends CrudRepository<Demo,Long>,CrudRepositoryInterface<Demo,Long>{    
}

Конфигурация для инъекций (я положил это в пакет / слой БД, а также)

@Configuration
public class InjectRepositoryConfig {    
    @Bean
    public CrudRepositoryInterface<Demo,Long> animalOwnerRepository(@Autowired DemoRepositoryAdapter demoRepositoryAdapter){
        return demoRepositoryAdapter;
    }
}

Пока все работает нормально, но я не уверен, как удалить / заменить / реорганизовать JPA из основного слоя?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Если вы действительно хотите следовать чистой архитектуре, то в классах вашего домена не должно быть ссылок на внешние библиотеки.Чтобы преодолеть это, можно использовать несколько стратегий:

  • Пользовательские отображения jpa / hibernate XML.Таким образом, вы можете легко преобразовать свои отображения и переключаться между sql / noSql, просто импортируя свой конфигурационный файл (каждый файл будет настраивать свой набор сопоставлений XML).

Недостатком этого подхода является то, чтовашему домену по-прежнему потребуется реализация Serializable , и большинству из них потребуются сеттеры / получатели для его полей или принудительное использование hibernate / jpa для игнорирования ограничений Java и доступа к закрытым полям.Кроме того, есть некоторые вещи, которые вы можете сделать с аннотациями, которые невозможны с XML, или обходной путь проблематичен.Это работает, но слой вашего домена все еще выглядит как простые DTO.

  • При пересечении границы используйте объекты DTO.Это означает, что у вас будет ваш доменный объект Demo и объект DTO DemoData , например.Данные будут извлекаться с использованием экземпляров DemoData, и хранилище должно преобразовывать эти два значения при сохранении / извлечении.

Этот последний подход позволяет очень легко изменить проект.Вы можете изменить постоянный слой в любое время, но для этого потребуется интегрировать новый слой хранилища данных.Допустим, вы хотите перейти на cassandra, вам потребуется новый DTO DemoDataCassandra , его средства отображения между ним и Demo, новые аннотации для сопоставлений и т. Д.

0 голосов
/ 02 октября 2018

Интерфейс для репозитория для сохранения сущностей находится в центре.Реализация этого интерфейса происходит на внешнем уровне, а реализация внедряется там, где это необходимо.

...