@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().