- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

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

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

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/ [11]

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

Артефакт в центральном 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/ [13]

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

Автор: lampsound


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/5243

Ссылки в тексте:

[1] пост: http://habrahabr.ru/post/139421/

[2] Spring Data-JPA: http://www.springsource.org/spring-data/jpa

[3] репозиториями: http://martinfowler.com/eaaCatalog/repository.html

[4] guice-persist: http://code.google.com/p/google-guice/wiki/GuicePersist

[5] спецификации: http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/

[6] batch-вставок: http://www.objectdb.com/java/jpa/persistence/store#Batch_Store_

[7] здесь: http://code.google.com/p/guice-repository/wiki/BatchStore

[8] здесь: http://code.google.com/p/guice-repository/wiki/AutoBind

[9] здесь: http://code.google.com/p/guice-repository/wiki/ImplementationSpecifics

[10] Репозитория: http://static.springsource.org/spring-data/data-jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html

[11] http://code.google.com/p/guice-repository/: http://code.google.com/p/guice-repository/

[12] http://code.google.com/p/guice-repository/wiki/DevGuide: http://code.google.com/p/guice-repository/wiki/DevGuide

[13] http://code.google.com/p/guice-repository/source/browse/tags/1.0.0/src/test/java/com/google/code/guice/repository/: http://code.google.com/p/guice-repository/source/browse/tags/1.0.0/src/test/java/com/google/code/guice/repository/