java - 删除一对一关系上的 jpa 实体

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

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

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/

相关文章:

java - 提取目录条目及其链接到的页码

java - 抽象类上的 Hibernate/JPA 映射

spring-boot - Spring 启动 : Custome @Query with 2 consecutive brackets cause that one pair is ignored

java - 使用 native 查询的 JPA 查询返回 null 而不是实体列表

java - 如何读取java中特定行号上方和下方的行?

java - 用户创建的开关选项?

javax.persistence.PersistenceException : No Persistence provider for EntityManager named money-transfer

java - Hibernate 仅将新记录插入数据库

java - Spring security 和 @Configuration 命令

java - 当我从客户端关闭套接字时,socket.getInputStream.read() 不会抛出异常