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

    Не так давно на Хабре был хороший пост посвященный проекту 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>



    Буду рад, если проект окажется вам полезным :)
    Спасибо за внимание!
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.