JPA: избыточный анти-паттерн сохранения - PullRequest
0 голосов
/ 01 ноября 2018

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

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

Согласно этому сообщению :

Метод сохранения не имеет смысла. Даже если мы удалим его, Hibernate по-прежнему будет выдавать оператор UPDATE, поскольку объект управляется и любое изменение состояния распространяется до тех пор, пока текущий EntityManager открыт.

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

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

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

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

1 Ответ

0 голосов
/ 02 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...