Это мои родительско-дочерние сущности:
@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, позиция = "СТОРОНА", позиция_деталь = "ОКНО".Я удаляю его из списка.
- Я создаю новую деталь с позицией = 'SIDE', position_detail = 'WINDOW' и добавляю ее в список.
- Я сохраняю расчет с использованием CrudRepository.save ()
- Я получаю сообщение об ошибке: двойное значение ключа нарушает уникальное ограничение "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));
}