Удаление сущности jpa в отношениях один-к-одному - PullRequest
0 голосов
/ 16 января 2020

У меня есть две таблицы, которые связаны с отношением один к одному:

public class Person {

  // some other fields

  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "image_id")
  private FileInfoModel image;

}

public class FileInfoModel {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @NotBlank
  private String name;

  @NotNull
  @Column(name = "size_in_bytes")
  private Long size;

  // some other fields

}

Когда я пытался удалить изображение с хранилищем: repository.deleteById (file.getId () ); Я получаю следующую ошибку:

обновление или удаление в таблице "file_info" нарушает ограничение внешнего ключа "fk_image" для таблицы "person".

Есть ли способ установить нулевое значение поля таблицы Person в таблице при удалении FileInfo из хранилища? Я знаю, что могу установить person.setImage (null) и сохранить его, а затем удалить файл, но я думаю, что может быть более простой способ с меньшим количеством шагов.

1 Ответ

0 голосов
/ 16 января 2020

Вы можете использовать JPQL-запрос, чтобы автоматически установить всех людей с этим изображением в нулевое изображение перед его удалением. Грубо говоря:

update Person p set p.image = null where p.image = :image

Я бы порекомендовал прояснить это и не реализовывать некоторые маги c через слушателей или подобное, так как вы, как правило, не ожидаете, что что-то будет удалено, когда ссылки на него все еще существуют.

...