@manytoone Проблема с сохранением jpa - повторяющаяся запись

Сценарий:

Предположим, у меня есть 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, который, кажется, устарел и т. д., но безуспешно.

Мы ценим любые предложения.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что следует избегать использования CascadeType.ALL с @ManyToOne, поскольку не имеет смысла транслировать изменения из дочерней записи в ее родительскую запись. Проблема с сохранением также связана с CascaseType.ALL.

Я предлагаю вам отключить каскад и внести изменения в «владельца» вручную с помощью его собственного класса репозитория (если вам нужно), а затем продолжить операцию сохранения «дома».

Спасибо за ответ. Я делаю именно это во втором решении, но подумал, что мне не хватает простой аннотации или чего-то еще.

Kruben Naidoo 22.05.2024 18:40

Другие вопросы по теме