Репозиторий Spring Crud - save () пытается вставить новые строки для отношения многие-к-одному в дочернем свойстве - PullRequest
0 голосов
/ 04 декабря 2018

Метод save () из хранилища Spring Crud выполняет операцию вставки, если идентификатор равен нулю, в противном случае он выполняет операцию обновления.У меня есть следующие компоненты Entity Beans -

Student {
 @Id integer studentId;
 ....
 @OneToMany Set<Project> projects;
 @OneToMany Set<Subject> subjects;
}

Project {
 @Id integer projectId;
 ....
 @ManyToOne Student student;
}

Subject {
 @Id integer subjectId;
 ....
 @ManyToOne Student student;
}

Если я использую репозиторий Spring Crud для выполнения операции save () в одном экземпляре Project p, он пытается выполнить вставку для всех субъектов, которые уже есть у p.studentбыли связаны.И в результате я получаю ошибку нарушения ограничения первичного ключа.

Spring jpa должен вставлять только проект, а не все дерево Student и его набор предметов.

Есть ли способсделать это?

1 Ответ

0 голосов
/ 05 декабря 2018

эта проблема возникает, когда вы не объявляете CasCadeType для связанной сущности, Cascade содержит несколько типов:

  1. CascadeType.PERSIST: тип каскада presist означает, что save () или persist ()каскадные операции со связанными объектами.
  2. CascadeType.MERGE: объединение каскадных типов означает, что связанные объекты объединяются при объединении объекта-владельца.
  3. CascadeType.REFRESH: обновление каскадного типа делает то же самое дляоперация refresh ().
  4. CascadeType.REMOVE: удаление каскадного типа удаляет все связанные сущности, связанные с этим параметром, при удалении объекта-владельца.
  5. CascadeType.DETACH: отсоединение каскадного типа отсоединяет все связанныесущности, если происходит «ручное отсоединение».
  6. CascadeType.ALL: каскадный тип all - сокращение от всех вышеперечисленных каскадных операций.

значение по умолчанию - Type.ALL для вашего случая вы должны изменить cascadeType по требованию.

...