Магический Репозиторий: интеграция Spring Data-JPA и Google Guice

в 22:42, , рубрики: guice, integration, java, jpa, repository, spring data, метки: , , , ,

Не так давно на Хабре был хороший пост посвященный проекту Spring Data-JPA.
Проект меня очень впечатлил, т.к. он предлагал хорошо продуманное решение для работы с репозиториями.
Собственные наработки на эту тему у нас имелись, однако Spring Data-JPA был намного более элегантным и функциональным решением.
Была одна загвоздка — проекты с которыми я работаю построены с применением Google Guice.
В свое время это был мой осознанный выбор и в целом он до сих пор устраивает как команды проектов, так и заказчиков.

… но концепция репозиториев от Spring Data-JPA была слишком вкусной…

В итоге некоторых размышлений было принято решение создать интеграционный модуль между Spring Data-JPA и подсистемой guice-persist из набора стандартных интеграционных модулей Google Guice.
Архитектура Spring Data-JPA грамотно спроектирована, благодаря чему такая интеграция и стала возможной.

Что из этого получилось

Перечень основных возможностей интеграционного модуля:

  • Полная поддержка частей 1.1-1.4 и 2.2-2.4 спецификации Spring Data-JPA
  • Поддержка batch-вставок (см. здесь)
  • Прямой досуп к EntityManager из Репозитория
  • Возможность проведения автобиндинга для всех репозиториев в указанных пакетах (см. здесь)
  • Конфигурирование — разделение общих моментов ORM-отображения и специфических параметров СУБД (см. здесь)

Как с этим работать

Здесь можно выделить три основных шага:

1. Создание вашего варианта Репозитория:

public interface AccountRepository extends JpaRepository<Account, Long>,
    EntityManagerProvider {

  Account findAccountByUuid(String uuid);

  @Query("select a from Account a where a.name = :name")
  Account findAccountByName(@Param("name") String name);
}

2. Установка интеграционного Guice-модуля:

install(new JpaRepositoryModule("my-persistence-unit") {
      protected void configureRepositories() {
        bind(AccountRepository.class).toProvider(new JpaRepositoryProvider<AccountRepository>());
      }
    });

3. Инъекция и использование:

public class AccountService {
 
  @Inject
  private AccountRepository accountRepository;

  public void registerUser(String login, String password) throws RegistrationException{
   // ... some checks & etc
   accountRepository.save(new Account(login, password));
   // ... something else
  }

  public Account findAccount(String login) throws FinderException{
   return accountRepository.findAccountByLogin(login);
  }
}

Проект доступен всем желающим под лицензией Apache License 2.0:
http://code.google.com/p/guice-repository/

Документация:
http://code.google.com/p/guice-repository/wiki/DevGuide

Артефакт в центральном Maven-репозитории:

<dependency>
  <groupId>com.google.code.guice-repository</groupId>
  <artifactId>guice-repository</artifactId>
  <version>1.0.0</version>
</dependency>

Живые примеры использования можно посмотреть в исходников JUnit-тестов модуля:
http://code.google.com/p/guice-repository/source/browse/tags/1.0.0/src/test/java/com/google/code/guice/repository/

Буду рад если проект окажется полезным для кого-то еще :)
Всем спасибо за внимание!

Автор: lampsound

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js