Как удалить сущность из списка и добавить новую, не нарушая ограничение уникальности? - PullRequest
0 голосов
/ 20 ноября 2018

Это мои родительско-дочерние сущности:

@Entity
public class Calculation {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @OneToMany(fetch = LAZY, cascade = ALL, orphanRemoval = true)
    @JoinColumn(name = "calculation_id", referencedColumnName = "id", nullable = false, foreignKey = @ForeignKey(name = "fk_standard_part"))
    private List<Part> parts;
}

@Entity
public class Part {
    @Column
    private String position;

    @Column
    private String positionDetail;
}

Я использую данные Hibernate и Spring:

  1. Я получаю расчет из базы данных, список деталейнаселен.
  2. В списке есть деталь, для которой параметр_счет = 1, позиция = "СТОРОНА", позиция_деталь = "ОКНО".Я удаляю его из списка.
  3. Я создаю новую деталь с позицией = 'SIDE', position_detail = 'WINDOW' и добавляю ее в список.
  4. Я сохраняю расчет с использованием CrudRepository.save ()
  5. Я получаю сообщение об ошибке: двойное значение ключа нарушает уникальное ограничение "uq_standard_operation". Подробно: Ключ (analysis_id, "position", position_detail) = (1, 'SIDE', 'WINDOW') уже существует.

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

РЕДАКТИРОВАТЬ 1: Вот фрагмент кода:

public Part repairStandardPart(Long calcId, String partNumber) {
    Part part = fetchNewPart(partNumber);
    Calculation calculation = getCalculation(calcId);
    // If there's a part with the same position allready I want to remove it...
    deletePartsAtPosition(calculation.getParts(), part.getPosition(), part.getSidePosition());
    // ...and then add the new one.
    calculation.getParts().add(part);
    calculationRepository.save(calculation);
    return part;
}

private void deletePartsAtPosition(List<Part> parts, String position, String positionDetail) {
    parts.removeIf(p -> Objects.equals(p.getPosition(), position) && Objects.equals(p.getPositionDetail(), positionDetail));
}
...