Почему я должен использовать @Modifying с @Transactional в весенних данных jpa? - PullRequest
0 голосов
/ 20 февраля 2020

При реализации данных, модифицирующих логи c с использованием аннотации Query (insert, update или delete) в JpaRepository, как @Transactional (необязательно в методе хранилища), так и @Modifying должны быть использованы.

Мое понимание заключается в следующем. Все грубые операции, предоставляемые JpaRepository, являются транзакционными, если мы их не перезаписываем. При реализации метода в репозитории мы должны убедиться, что он все еще транзакционный. Это может быть достигнуто простым аннотированием @Transactional. Значение по умолчанию readOnly равно false, поэтому spring "знает", что это модифицирующий запрос.

Вопрос в следующем: зачем нам тогда аннотация @Modifying (вместе с @Transactional )? Может быть, я что-то упускаю?

Мне известны такие обсуждения, как this или that , но я упускаю явное объяснение почему необходимо использовать @Modifying, если @Transactional несет всю необходимую информацию.

1 Ответ

1 голос
/ 21 февраля 2020

Из справочных документов

По умолчанию методы CRUD в экземплярах репозитория являются транзакционными. Для операций чтения флаг readOnly конфигурации транзакции имеет значение true. Все остальные настроены с помощью простого @Transactional, так что применяется конфигурация транзакций по умолчанию.

и @ Modifying отвечают на вопрос зачем нам тогда аннотация @Modifying?

Указывает, что метод запроса следует рассматривать как модифицирующий запрос, поскольку он изменяет способ его выполнения. Эта аннотация учитывается только в том случае, если она используется в методах запросов, определенных в аннотации Query). Он не применяется к пользовательским методам реализации или запросам, полученным из имени метода, поскольку они уже имеют контроль над базовыми API доступа к данным или указывают, изменяются ли они по их имени.

Запросы, для которых требуется @Modifying аннотация включает операторы INSERT, UPDATE, DELETE и DDL.

также

Аннотация @Modifying уместна только в сочетании с @ Запрос аннотации. Производные методы запросов или пользовательские методы не требуют этой аннотации.

(вместе с @Transactional)

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

...