Я пытался обновить или вставить дочерние объекты, когда родитель находится в таблице.
Но у меня нет идентификатора родительской сущности , только имя .
В родительской таблице у меня есть два ограничения PK по идентификатору и уникальное ограничение по имени.
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Parent{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NaturalId
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Child> childrens;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Parent)) return false;
Parent that = (Parent) o;
return Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return 31;
}
}
Детский стол
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Child{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true)
private String name;
private String description;
}
И используя SpringData с JpaRepository, я хочу вставить новых детей с помощью метода сохранения parentRepository.save(List<Parent> parents)
.
Он работает только при первом сохранении, когда я добавляю новые данные - родители с детьми. Но когда я хочу обновить родителей новых детей, я получаю исключение:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "parent_parent_name_key"
. Ключ (name) = (some-name) уже существует.
Я использую POSTGRESQL
Есть ли способ настроить это? Или только одно решение - загрузить всех родителей по имени, а затем обновить все на Java-объектах