当前位置: 首页 > 知识库问答 >
问题:

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

公羊喜
2023-03-14

我有两个已经存在于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;
}

表B的实体定义如下:

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());
    }

我的问题是,有没有更好的方法来检查这种违规行为?我可以做些什么来更好地构造SpringDataJPA中的外键约束?

共有1个答案

闻人树
2023-03-14

因此,B和A之间存在多对一的关系,表B中的多条记录对应于表A中的一条记录。

JPA实体中的这种东西是用< code>@ManyToOne注释处理的。您通常不直接引用任何id字段,而是告诉JPA应该有什么。所以在你的课堂上...镜头?)应该是这样的:

@ManyToOne
private TableA tableA;

// and get rid of this
// @Column(name = "user_id")
// private Long userId;

可选的——所以不一定——你可以在你的表A中:

@OneToMany
private List<TableB> tableBsOrShouldICallYouShots;

我不知道你的实际问题是什么,但是当直接设置和引用id字段时可能会导致你的困难。

现在,如果您 - 例如 - 使用存储库找到一些TableB,那么之后就可以这样做

tableB.getTableA()

在保存时,您会在此之前执行以下操作:

tableB.setTableA(somSortOftableA);
// so not tableB.setUserId(someLongIdFOrtableA);

现在的要点是引用完整性没有问题,因为您不需要知道任何ID,也不能设置任何错误的ID。除非在将TableA设置为TableB之前,您首先需要通过id获取table a,但是在这种情况下,您仍然不需要设置任何id。

 类似资料:
  • 我正在使用Spring和Hibernate,我得到了这个例外。以下是我试图获得的:我有User和UserSettings类,它们以OneToMany和ManyToOne注释为界,如下所示: 现在,我想为用户添加设置,我是这样做的: 问题来了:UserSettings中的用户持有旧设置和新设置的集合(设置,我刚刚创建并想要添加),但旧设置持有用户的集合,其中没有新设置。我想这就是为什么我会遇到异常,

  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?

  • 问题内容: 我有这两张表 Table: Guards Table: Squads 该列指向表中的列,我正在尝试创建一个约束,以检查链接到作为领导者提供的保护ID的列是否为特定值(在本例中为1) 这可能吗?还是我必须使用扳机? 问题答案: 您需要添加一个约束。我将约束包装到一个函数中,因为您需要检查另一个表的值。 该函数将检查防护等级是否足够高:请确保将其设置为适当的值,或者甚至更好地从另一个表中获

  • 问题内容: 我有一个用户表,例如: 和一张有工作的桌子: 可以将作业分配给用户,但只能分配给超级用户。其他用户无法分配作业。 因此,我有一个表格,通过它可以查看将哪个作业分配给了哪个用户: 但是我想创建一个检查约束,该约束引用具有的用户。 那可能吗?还是有其他解决方案? 问题答案: 这将适用于INSERTS: 然后在user_has_job表上检查约束: 适用于插入物: 但是,这是可能的: 因此,

  • 在现有答案中搜索没有给出有效结果。这就是我找不到原因的错误。我有一个实体类< code>MeteoRecord和< code>DayDegree,定义如下: 所有实体都扩展< code>AbstractEntity类: 保存新的如下所示: 它会引发错误: “气象仓库”只是扩展了“”JPA存储库: 我激活了更多日志以查看SQL查询,但没有看到创建新的其他查询,也没有在其他地方插入记录: 我错过了什么

  • 使用Laravel 5.3和雄辩模型,试图制作一个用户角色模型。我有2个表用户和角色的主要模式,每个用户都有一个角色,每个角色都有很多用户(一对多的关系)。 当我试图在用户表中创建一个引用角色表中id的外键时,它会给我这个错误 在Connection.php647行: SQLSTATE[HY000]:一般错误:1005无法创建表mydata。#sql-7e0_71(错误号:150“外键约束格式不正