【发布时间】:2020-09-20 03:26:56
【问题描述】:
我有两个表已经存在于 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 Data JPA 中的外键约束?
【问题讨论】:
-
您可以使用@OneToMany进行映射并在之前获取以检查是否存在或抛出异常vladmihalcea.com/…
-
不使用映射的唯一其他方法是使用附加查询验证对象是否在数据库中。现在它需要额外的查询来验证,但我认为当你处理 ID 时,你不能信任客户端并且总是必须验证。您的方法的问题是当有多个这样的字段并且想要返回特定错误时。即使使用映射,您也需要获取对象,因此需要额外的查询。
标签: java spring-boot hibernate jpa spring-data-jpa