我有两个与一对一关系相关的表:
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()); 我收到以下错误:
update or delete on table "file_info" violates foreign key constraint "fk_image" on table "person".
从存储库中删除 FileInfo 时,有什么方法可以将 Person 表 image_id 字段设置为 null 吗?我知道我可以设置 person.setImage(null) 并保存它,然后删除该文件,但我认为可能有一种更简单的方法,步骤更少。
最佳答案
您可以使用 JPQL 查询在删除该图像之前自动将所有具有该图像的人员设置为空图像。大致:
update Person p set p.image = null where p.image = :image
我建议明确这一点,不要通过监听器或类似的方式实现一些魔法,因为当对它的引用仍然存在时,您通常不会期望某些内容被删除。
关于java - 删除一对一关系上的 jpa 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59769749/