如何使用 JPA 和 H2 数据库在删除时强制执行外键约束

时间:2021-04-26 12:08:32

标签: database spring-boot jpa foreign-keys constraints

我有一个 Spring Boot 应用程序,它在 h2 数据库中有 2 个表:计算机 和一个 处理器

计算机和处理器之间存在单向、多对一关系,因此许多计算机可以有一个处理器。

@Entity
@Table(name = "Computer", schema = "CS")
public class Computer extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "computer_id")
    @Getter
    @Setter
    private long id;
    ...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "processor_id")
    @OnDelete(action= OnDeleteAction.NO_ACTION)
    @Getter
    @Setter
    private Processor processor;
    ...
}

@Entity
@Table(name = "Processor", schema = "CS")
public class Processor extends BaseEntity {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "processor_id")
     @Getter@Setter
     private long id;
    ...
}

我想在数据库级别强制执行,当我尝试删除至少被一台计算机引用的处理器时,由于外键约束,JPA 不允许完成删除。

我知道可以通过编程方式完成此功能,例如查找与某个处理器关联的所有计算机,但这似乎是一种代码异味,如果让 JPA 注释为我处理此问题,则是理想的选择有可能。

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试使用 @ForeignKey 注释,我之前没有使用过它,但从文档中它应该可以满足您的需求: https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/ForeignKey.html

另一种方法是使用实​​体生命周期回调(请参阅https://www.baeldung.com/jpa-entity-lifecycle-events)。一种 @PreRemove 方法,您可以在其中检查是否有任何实体依赖于您要删除的实体并抛出自定义运行时异常...但第一种方法应该足够了

答案 1 :(得分:0)

感谢您的帮助;我已经解决了这个问题。 我的数据库架构中的外键约束有错误。注释工作正常,@OnDelete(action= OnDeleteAction.NO_ACTION) 注释是不必要的。