О чем на самом деле ваш вопрос? Использование @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
к методам управления, которые вы могли объявить или изменить в этом интерфейсе.