Какой метод используется для вставки данных в Spring Data JPA Repository?

Ответ

Для сохранения (вставки или обновления) сущности в Spring Data JPA используется метод save() (или saveAll() для пакетной операции), унаследованный от интерфейсов CrudRepository или JpaRepository.

Как работает save():

  • Если у сущности ID равен null (или 0 для примитивов) — выполняется EntityManager.persist(), создается новая запись в БД.
  • Если ID уже существует — выполняется EntityManager.merge(), существующая запись обновляется.
  • Метод возвращает управляемую сущность (с заполненным ID после вставки).

Пример:

public interface UserRepository extends JpaRepository<User, Long> {}

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User createUser(String name, String email) {
        User newUser = new User(); // ID = null
        newUser.setName(name);
        newUser.setEmail(email);
        // Вставка новой записи
        return userRepository.save(newUser); // ID будет заполнен
    }

    public void updateUser(User user) {
        // Обновление существующей записи (user.id != null)
        userRepository.save(user);
    }

    public void createUsersBatch(List<User> users) {
        // Пакетная вставка (более эффективно для множества записей)
        userRepository.saveAll(users);
    }
}

Ответ 18+ 🔞

А, слушай, вот это тема, про которую можно долго и смачно рассуждать, блядь. Ну, типа, как в Спринге запихнуть свою сущность в базу, чтобы она там прижилась, а не вывалилась с ошибкой, как дурак на льду.

Так вот, есть у них там, у этих умных дядек, метод save(). Ну, или saveAll(), если ты такой щедрый, что решил закинуть всё и сразу, овердохуища данных. Берёшь ты этот метод из CrudRepository или JpaRepository — они там, в общем-то, почти одно и то же, как братья-близнецы, только один чуть умнее.

Как эта штука работает, ёпта:

  • Смотри, если у твоей сущности ID — это пустота, ничто, null (или ноль, если ты совсем ретроград и примитивы используешь), то Спринг такой: «Ага, новенький!» — и делает EntityManager.persist(). То есть, вставляет новую запись в базу, как гвоздь в стену.
  • А если ID уже есть, какой-то левый номер присвоен, то он такой: «О, старый знакомый!» — и делает EntityManager.merge(). То есть, обновляет существующую запись, как будто ты пришёл в парикмахерскую и просишь «подровняй тут, блядь».
  • И главное, блядь, метод этот возвращает тебе сущность обратно, но уже управляемую, с проставленным ID. Как будто ты отдал ребёнка в садик, а тебе его назад приводят, но уже с поделкой из пластилина.

Вот, смотри, как это выглядит в коде, чтобы не быть, прости господи, мартышлюшкой:

// Это наш репозиторий, он всё умеет, как швейцарский нож
public interface UserRepository extends JpaRepository<User, Long> {}

// А это сервис, где вся магия и происходит
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository; // Внедряем зависимость, как шпиона

    // Создаём нового юзера, типа, регистрируем
    public User createUser(String name, String email) {
        User newUser = new User(); // ID тут — null, полная пустота
        newUser.setName(name);
        newUser.setEmail(email);
        // Вставляем новую запись, как письмо в почтовый ящик
        return userRepository.save(newUser); // Теперь у него ID есть, красава!
    }

    // Апдейтим существующего, типа, сменил аватарку
    public void updateUser(User user) {
        // Тут user.id уже не null, значит, будет обновление
        userRepository.save(user); // Мержим, блядь, как два документа в Ворде
    }

    // Пакетная вставка, для тех, кто любит размах
    public void createUsersBatch(List<User> users) {
        // Закидываем всех разом, эффективно, как пулемёт
        userRepository.saveAll(users);
    }
}

Вот и вся философия, блядь. Главное — не перепутай, когда persist, а когда merge, а то получится, как в той поговорке: «Хотел как лучше, а получилось — вротберунчик».