@Transactional spring JPA .save() не требуется?

Я понимаю, что если мы используем аннотацию @Transactional. Метод save() не нужен. Это точно?

И для моего примера:

@Transactional
void methodA() {
   ...
   ObjectEntity objectEntity = objectRepository.find(); 
   methodB(objectEntity);
}

void methodB(ObjectEntity obj) {
   ...
   obj.setName("toto");
   objectRepository.save(obj);    <-- is it necessary?
}

Спасибо за вашу помощь

2 ответа

Решение

Это работает следующим образом:

  • save() присоединяет сущность к сеансу, и в конце транзакции, пока не было исключений, все это будет сохранено в базе данных.

  • Теперь, если вы получите объект из БД (например, ObjectEntity objectEntity = objectRepository.find();), то этот объект уже прикреплен, и вам не нужно вызывать метод save().

  • Однако, если объект отсоединен (например, ObjectEntity objectEntity = new ObjectEntity();), то вы должны использовать метод save(), чтобы присоединить его к сеансу, чтобы внесенные в него изменения сохранялись в БД.

[Слишком поздно, но я надеюсь, что это будет полезно будущим читателям] :

В контексте транзакции обновление управляемого экземпляра отражается в постоянном хранилище во время фиксации/сброса, т. е. в вашем случае в конце methodB(). Тем не менее, вызов save()в таких сценариях, как ваш, обходится дорого, как указано в Spring Boot Persistence Best Practices:

Наличие или отсутствие save() не влияет на количество или тип запросов, но по-прежнему снижает производительность, потому что метод save() за кулисами запускает событие MergeEvent, которое выполняет множество внутренних операций, специфичных для Hibernate. бесполезные в данном случае действия. Таким образом, в подобных сценариях избегайте явного вызова метода save().

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