【问题标题】:Deleting jpa entity on One-To-One relationship删除一对一关系上的 jpa 实体
【发布时间】:2020-01-16 12:29:23
【问题描述】:

我有两个与一对一关系相关的表:

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”。

在从存储库中删除 FileInfo 时,有什么方法可以将 Person 表 image_id 字段设置为 null?我知道我可以设置 person.setImage(null) 并保存它然后删除文件,但我认为可能有更简单的方法,步骤更少。

【问题讨论】:

    标签: java hibernate spring-boot jpa spring-data-jpa


    【解决方案1】:

    您可以使用 JPQL 查询在删除该图像之前自动将所有具有该图像的人员设置为空图像。大致:

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

    我建议明确说明这一点,不要通过侦听器或类似方法实现一些魔法,因为您通常不希望在对它的引用仍然存在时删除某些内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多