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