До версии M2 Spring Data мы требовали, чтобы пользователи продлили JpaRepository
по следующим причинам:
- Инфраструктура сканирования пути к классам только подобрала интерфейсы, расширяющие этот интерфейс, поскольку можно было бы использовать Spring Data JPA и Spring Data Mongo параллельно, и оба они указывали бы на один и тот же пакет, неясно, для какого хранилища создать прокси-сервер. , Однако, начиная с RC1, мы просто оставляем это бремя для разработчика, так как считаем, что это довольно экзотический случай, и польза от использования
Repository
, CrudRepository
или тому подобного перевешивает усилия, которые вы должны предпринять в только что описанном угловом случае. Вы можете использовать элементы exclude
и include
в пространстве имен, чтобы получить более полный контроль над этим.
- До M2 мы применяли транзакционность к методам CRUD, перераспределяя методы CRUD и помечая их
@Transactional
. Это решение, в свою очередь, было основано на алгоритме AnnotationTransactionAttributeSource
, который используется для поиска конфигурации транзакции. Поскольку мы хотели предоставить пользователю возможность перенастроить транзакции, просто изменив метку метода CRUD в интерфейсе конкретного репозитория и применив к нему @Transactional
. Для RC1 мы решили реализовать пользовательский TransactionAttributeSource
, чтобы иметь возможность перемещать аннотации обратно в реализацию CRUD хранилища.
Короче говоря, вот что сводится к следующему:
Начиная с RC1 больше нет необходимости расширять интерфейс хранилища для конкретного хранилища, , за исключением , вы хотите ...
- Используйте
List
доступ к findAll(…)
вместо Iterable
в более основных интерфейсах репозитория (хотя вы можете просто переопределить соответствующие методы в общем базовом интерфейсе, чтобы получить List
s как хорошо)
- Вы хотите использовать специфичные для JPA методы, такие как
saveAndFlush(…)
и т. Д.
Как правило, вы намного более гибки в отношении использования методов CRUD, начиная с RC1, поскольку вы можете даже расширить интерфейс маркера Repository
и выборочно добавить методы CRUD, которые вы хотите выставить. Поскольку вспомогательная реализация будет по-прежнему реализовывать все методы PagingAndSortingRepository
, мы все равно можем направить вызовы к экземпляру:
public interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
List<T> findAll();
T findOne(ID id);
}
public interface UserRepository extends MyBaseRepository<User, Long> {
List<T> findByUsername(String username);
}
В этом примере мы определяем MyBaseRepository
, чтобы выставлять только findAll()
и findOne(…)
(которые будут направлены в экземпляр, реализующий методы CRUD) и конкретный репозиторий, добавляя метод поиска к двум CRUD.
Для получения более подробной информации по этой теме, пожалуйста, обратитесь к справочной документации .