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