繁体   English   中英

在 Hibernate 中检查是否违反外键约束的正确方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM