Существует ли метод update в Spring Data JPA репозиториях?

«Существует ли метод update в Spring Data JPA репозиториях?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Прямого метода update в стандартном репозитории (JpaRepository) нет. Это связано с концепцией JPA: сущности, загруженные в контексте persistence (управляемые), автоматически отслеживаются. Изменения в их полях синхронизируются с БД при коммите транзакции.

Основные способы обновления:

  1. Изменение управляемой сущности (наиболее частый способ):

    @Transactional
    public void updateUserName(Long userId, String newName) {
        User user = userRepository.findById(userId).orElseThrow();
        user.setName(newName); // Изменение отслеживается
        // Метод save() не обязателен, но может быть вызван для ясности
        // userRepository.save(user);
    } // При завершении транзакции изменения flush'утся в БД
  2. Использование save(): Метод save() выполняет merge() — если у сущности есть ID, она будет обновлена.

  3. Именованный или нативный запрос с @Modifying:

    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
    
        @Modifying // Указывает, что запрос изменяет данные
        @Query("UPDATE User u SET u.email = :email WHERE u.id = :id")
        @Transactional // Необходимо для модифицирующих операций
        int updateUserEmail(@Param("id") Long id, @Param("email") String email);
    }

    Важно: Методы с @Modifying должны выполняться внутри транзакции (@Transactional).