Сценарий:
Предположим, у меня есть jpa-приложение Springboot:
public class Home {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long homeId;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "ownerId")
private Owner owner;
// attributes & other methods
}
public class Owner {
private String ownerId; // not auto-generated
// attributes and methods
}
Что происходит, так это то, что я могу сохранить первый дом (и владельца, если не в базе данных mysql) с помощью моего приложения Springboot:
Итак, что-то вроде: homeRepository.save(мойдом); // myhome — это домашний объект, заполненный значениями
Теперь проблема в том, что когда я пытаюсь сохранить другой дом для того же владельца, выдается исключение:
org.springframework.dao.DataIntegrityViolationException: не удалось выполнить оператор [Дубликат записи «741202» для ключа «owner.PRIMARY»] [вставить в ....
По сути, это говорит мне о том, что при попытке сохранить «новый дом» он видит, что владелец уже существует, и не может выполнить вставку, потому что это будет дублировать основное нарушение.
Я искал в Интернете некоторую помощь по обходному пути для @manytoone, jpa, двунаправленного, изменения cascade.save_update, который, кажется, устарел и т. д., но безуспешно.
Мы ценим любые предложения.




Я думаю, что следует избегать использования CascadeType.ALL с @ManyToOne, поскольку не имеет смысла транслировать изменения из дочерней записи в ее родительскую запись. Проблема с сохранением также связана с CascaseType.ALL.
Я предлагаю вам отключить каскад и внести изменения в «владельца» вручную с помощью его собственного класса репозитория (если вам нужно), а затем продолжить операцию сохранения «дома».
Спасибо за ответ. Я делаю именно это во втором решении, но подумал, что мне не хватает простой аннотации или чего-то еще.