О чем на самом деле ваш вопрос? Использование @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
к методам управления, которые вы могли объявить или изменить в этом интерфейсе.
@Transactional(readOnly = true)
в интерфейсе (поскольку он обычно содержит в основном методы поиска) и переопределить этот параметр для каждого метода изменения запроса с помощью простого@Transactional
. На самом деле так это и делаетсяSimpleJpaRepositoy
.Я думаю, что вопрос немного шире и не может быть сокращен по аннотациям на уровне доступа к данным. Нам нужно рассмотреть весь стек приложения, стратегии транзакций, которые мы хотим применить, и так далее. На сайте IBM developerworks есть очень исчерпывающий набор статей по этой теме Марка Ричардса. Вы можете найти первый здесь: https://developer.ibm.com/articles/j-ts1/
С уважением
источник
Вы должны использовать
@Repository
аннотациюЭто связано с тем, что
@Repository
он используется для перевода вашего непроверенного исключения SQL в Spring Excpetion, и единственное исключение, с которым вы должны работать, этоDataAccessException
источник
Мы также используем аннотацию @Transactional для блокировки записи, чтобы другой поток / запрос не изменил чтение.
источник