如何使用 JPA 和 H2 数据库对删除执行外键约束
How to Enforce Foreign Key Constraint on Delete with JPA and H2 Database
我有一个 Spring 启动应用程序,它在 h2 数据库中有 2 个表:Computer 和一个 Processor。
计算机和处理器之间存在单向、多对一关系,因此许多计算机可以有一个处理器。
@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) 注释是不必要的。
我有一个 Spring 启动应用程序,它在 h2 数据库中有 2 个表:Computer 和一个 Processor。
计算机和处理器之间存在单向、多对一关系,因此许多计算机可以有一个处理器。
@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) 注释是不必要的。