О чем на самом деле ваш вопрос? Использование @Repositoryаннотации или @Transactional.
@Repositoryне требуется вообще, поскольку объявляемый вами интерфейс будет поддерживаться прокси-сервером, который инфраструктура Spring Data создает и в любом случае активирует преобразование исключений. Таким образом, использование этой аннотации в интерфейсе репозитория Spring Data вообще не имеет никакого эффекта.
@Transactional- для модуля JPA у нас есть эта аннотация класса реализации, поддерживающего proxy ( SimpleJpaRepository). Это происходит по двум причинам: во-первых, для сохранения и удаления объектов требуется транзакция в JPA. Таким образом, нам нужно убедиться, что транзакция выполняется, что мы делаем, аннотируя метод с помощью@Transactional .
Чтение методов , как findAll()и findOne(…)использует @Transactional(readOnly = true), не является строго необходимым , но вызывает несколько оптимизаций в инфраструктуре транзакции (установив FlushModeдля MANUALпозволить живучести поставщиков потенциально пропустить грязные проверки при закрытии EntityManager). Кроме того, установлен флаг и для соединения JDBC, что вызывает дальнейшую оптимизацию на этом уровне.
В зависимости от того, какую базу данных вы используете, он может опускать блокировки таблиц или даже отклонять операции записи, которые вы могли вызвать случайно. Таким образом, мы рекомендуем также использовать @Transactional(readOnly = true)для запросов методы, которые вы можете легко добиться, добавив эту аннотацию в интерфейс репозитория. Убедитесь, что вы добавили равнину @Transactionalк методам управления, которые вы могли объявить или изменить в этом интерфейсе.