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