Обновите дочерние объекты, зная только родительский @NaturaId. SpringData JPA - PullRequest
0 голосов
/ 10 января 2019

Я пытался обновить или вставить дочерние объекты, когда родитель находится в таблице. Но у меня нет идентификатора родительской сущности , только имя . В родительской таблице у меня есть два ограничения 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-объектах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...