Pull to refresh

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

Reading time 3 min
Views 3.9K
Не так давно на Хабре был хороший пост посвященный проекту 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);
  }
}



Живые примеры использования можно посмотреть в JUnit-тестах проекта:
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/wiki/DevGuide

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

Артефакт в центральном Maven-репозитории:
<dependency>
  <groupId>com.google.code.guice-repository</groupId>
  <artifactId>guice-repository</artifactId>
  <version>1.0.0</version>
</dependency>



Буду рад, если проект окажется вам полезным :)
Спасибо за внимание!
Tags:
Hubs:
+4
Comments 0
Comments Leave a comment

Articles