JPA как обновить сущности в БД не по ключевому полю?
Имеется сущность:
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
String name;
Long companyId;
}
Также имеется репозиторий c методом saveAll:
@Override
public List<Category> saveAll(List<Category> categories) {
List<Category> categoriesInRepoCategories = new ArrayList<>();
categoryRepository.saveAll(categories).forEach(categoriesInRepoCategories::add);
return categoriesInRepoCategories;
}
Проблема собственно вот в чем, список категорий я каждый раз получаю парсингом с сайта, соответственно мне не известны id, и при вызове saveAll у меня в базу дублируются записи. Я так понимаю решения из коробки по данному случае нету? И придется изначально извлекать все записи из БД, сопоставлять их по имени с теми что вернул парсер (проставлять существующим id) и записывать полученные данные в БД, или все же можно как-то пометить поле name?
В итоге добавил такой метод:
public List<Category> upsertAll(List<Category> categories) {
List<Category> categoriesInRepoCategories = findAll();
categories.forEach(c -> {
Long id = categoriesInRepoCategories.stream().filter(cc -> cc.getName().equals(c.getName())).findAny().orElse(c).getId();
c.setId(id);
});
return saveAll(categories);
}
Ответы (1 шт):
Spring в методе save() использует следующую логику. Если у сущности есть id, то вызывается метод update(), если id отсутствует то вызывается save().
Соответственно теперь вам нужно реализовать эту логику самому.
Почему не аннотировали name - @Column(unique=true), если дубли не должны попадать?