如何使用jpa和h2数据库对delete执行外键约束

mrwjdhj3  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(404)

我有一个springboot应用程序,在h2数据库中有两个表:计算机和处理器。
计算机和处理器之间存在单向的多对一关系,因此许多计算机可以有一个处理器。

@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注解来处理这个问题是非常理想的。
谢谢您!

bpzcxfmw

bpzcxfmw1#

试试这个 @ForeignKey 注解,我以前没用过,但从文档来看,它应该可以满足您的要求:https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/foreignkey.html
另一种方法是使用实体生命周期回调(请参见https://www.baeldung.com/jpa-entity-lifecycle-events). 一 @PreRemove 方法,在此方法中检查是否有任何实体依赖于要删除的实体,并引发自定义运行时异常。。。但第一种方法就足够了

szqfcxe2

szqfcxe22#

谢谢你的帮助;我已经解决了这个问题。我的数据库架构中的外键约束出错。注解工作正常,@ondelete(action=ondeleteaction.no\u action)注解是不必要的。

相关问题