[英]Correct way to check for foreign key constraint violation in Hibernate?
我有两个表已经存在于 postgres 中,我们称之为表 A 和表 B。表 B 的一列有一个外键约束,因为它必须是表 A 的主键。因此有一个多对- B和A的一种关系,B表的多条记录对应A表的一条记录。
这两个表的实体定义如下。
public class TableA implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long userId;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
@Column(name = "phone_number")
private String phoneNumber;
}
TableB的实体定义如下:
public class Shots implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "item_id")
private Long itemId;
@Column(name = "user_id")
private Long userId;
}
其中 userId 是外键映射到表 A 中的主键 user_id。这些约束已经在底层 postgres 数据库中定义,所以我没有考虑使用 @ManyToOne 注释关系(仍在尝试绕过它) .
我目前处理发生外键约束冲突的情况的方式是执行以下操作:
try {
tableBrepository.save(newShot);
} catch (ConstraintViolationException ex) {
logger.error("Violating foreign key constraint" + ex.getMessage());
}
我的问题是,有没有更好的方法来检查这种违规行为? 我能做些什么来更好地构建 Spring 数据 JPA 中的外键约束?
因此B和A之间存在多对一的关系,B表中的多条记录对应A表中的一条记录。
JPA 实体中的这种东西是用@ManyToOne
注释处理的。 您通常不会直接引用任何id字段,而是告诉 JPA 应该有什么。 因此,在您的 class TableB 中(或者我应该称它为...镜头?)应该是这样的:
@ManyToOne
private TableA tableA;
// and get rid of this
// @Column(name = "user_id")
// private Long userId;
并且可选地 - 所以不一定 - 你可以在你的 TableA 中拥有:
@OneToMany
private List<TableB> tableBsOrShouldICallYouShots;
我不确定您的实际问题是什么,但是直接设置和引用 id 字段可能会给您带来困难。
现在,如果您 - 例如 - 使用存储库来查找一些TableB
,那么您可以在那之后做
tableB.getTableA()
在保存之前你会做:
tableB.setTableA(somSortOftableA);
// so not tableB.setUserId(someLongIdFOrtableA);
现在的重点是参照完整性没有问题,因为您不需要知道任何 ID,也不能设置任何错误的 ID。 除非您首先需要在将 TableA 设置为 TableB 之前通过 id 获取它,但在那种情况下您仍然不会设置任何 ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.