微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个 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 注释为我处理此问题,则是理想的选择有可能。

谢谢!

解决方法

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

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

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。