我有一个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注解来处理这个问题是非常理想的。
谢谢您!
2条答案
按热度按时间bpzcxfmw1#
试试这个
@ForeignKey
注解,我以前没用过,但从文档来看,它应该可以满足您的要求:https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/foreignkey.html另一种方法是使用实体生命周期回调(请参见https://www.baeldung.com/jpa-entity-lifecycle-events). 一
@PreRemove
方法,在此方法中检查是否有任何实体依赖于要删除的实体,并引发自定义运行时异常。。。但第一种方法就足够了szqfcxe22#
谢谢你的帮助;我已经解决了这个问题。我的数据库架构中的外键约束出错。注解工作正常,@ondelete(action=ondeleteaction.no\u action)注解是不必要的。