JPA: избыточный анти-шаблон сохранения

Итак, у меня есть такой метод:

@Transactional
public void savePostTitle(Long postId, String title) {
    Post post = postRepository.findOne(postId);
    post.setTitle(title);
}

Согласно этому Почта:

The save method serves no purpose. Even if we remove it, Hibernate will still issue the UPDATE statement since the entity is managed and any state change is propagated as long as the currently running EntityManager is open.

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

public void savePostTitle(Long postId, String title) {
        Post post = postRepository.findOne(postId);
        post.setTitle(title);
    }

Hibernate не будет выдавать инструкцию обновления, поэтому нужно вызывать postRepository.save(post); явно.

В чем разница между использованием @Transactional или нет в этом конкретном сценарии?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
0
917
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В стандартной конфигурации область контекста сохранения привязана к транзакции.

Если у вас нет явной транзакции, определенной с помощью аннотации, ваша (несуществующая) транзакция охватывает только вызов чтения в базе данных. После этого только что загруженный объект не управляется. Это означает, что его изменения не будут отслеживаться и сохраняться. Промывка не поможет, потому что никаких изменений не отслеживается.

Другие вопросы по теме