Подтвердить что ты не робот

Как использовать @Transactional с данными Spring?

Я только начал работать над проектом Spring-data, Hibernate, MySQL, JPA. Я переключился на данные Spring, чтобы мне не пришлось беспокоиться о создании запросов вручную.

Я заметил, что использование @Transactional не требуется, когда вы используете данные @Transactional так как я также пробовал свои запросы без аннотации.

Есть ли конкретная причина, почему я не должен/не должен использовать аннотацию @Transactional?

Работает:

@Transactional
public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

Также работает:

public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

Заранее спасибо!

4b9b3361

Ответ 1

В чем ваш вопрос? Использование аннотации @Repository или @Transactional.

@Repository вообще не требуется, поскольку интерфейс, который вы объявляете, будет поддерживаться прокси-сервером Spring. Инфраструктура данных создает и активирует перевод исключений в любом случае. Поэтому использование этой аннотации в интерфейсе репозитория Spring не имеет никакого эффекта.

@Transactional - для модуля JPA мы имеем эту аннотацию для класса реализации, поддерживающего прокси (SimpleJpaRepository). Это происходит по двум причинам: во-первых, для сохранения и удаления объектов требуется транзакция в JPA. Таким образом, мы должны убедиться, что транзакция выполняется, что мы делаем с помощью метода, аннотированного с помощью @Transactional.

Методы чтения, такие как findAll() и findOne(…), используют @Transactional(readOnly = true), что не является строго необходимым, но вызывает несколько оптимизаций в инфраструктуре транзакций (установка FlushMode в MANUAL, чтобы поставщики персистентности могли пропускать грязные проверки при закрытии EntityManager). Кроме того, флаг также устанавливается в JDBC-соединении, что приводит к дальнейшим оптимизации на этом уровне.

В зависимости от того, какая база данных вы используете, она может опускать блокировки таблиц или даже отклонять операции записи, которые могут возникнуть случайно. Таким образом, мы рекомендуем использовать @Transactional(readOnly = true) для методов запросов, которые вы можете легко достичь, добавив эту аннотацию к вашему интерфейсу репозитория. Убедитесь, что вы добавили простой @Transactional к методам управления, которые вы, возможно, объявили или перекрасили в этом интерфейсе.

Ответ 2

Я думаю, что вопрос немного шире и не может быть уменьшен на аннотации на уровне доступа к данным. Нам нужно рассмотреть весь стек приложения, стратегии транзакций, которые мы хотим применить, и так далее. На этой теме есть очень подробный набор статей по этой теме Марк Ричардс на сайте IBM developerworks. Вы можете найти первый здесь: http://www.ibm.com/developerworks/java/library/j-ts1/index.html

С наилучшими пожеланиями

Ответ 3

Вы должны использовать аннотацию @Repository

Это связано с тем, что @Repository используется для перевода вашего исключенного исключения SQL в Spring Excpetion, и единственным исключением, с которым вы должны иметь дело, является DataAccessException