【发布时间】:2020-09-03 19:01:21
【问题描述】:
我在使用 Spring 数据 JpaRepository 将数据持久化到 PostgresSQL DB 的实现中遇到了一个奇怪的问题
在我的实体类中,我有以下列:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private int id;
@Column(name = "field1", nullable = false, length = 16)
private String field1;
@Column(name = "field2", nullable = false, length = 16)
private String field2;
@Column(name = "field3", nullable = false, length = 16)
private String field3;
我最初避免将上面的字段声明为复合字段,因为有许多字段要作为复合键处理。我认为 java 代码检查在所有情况下都可以解决问题
所以基本上,我必须根据 field1、field2 和 field3 来保持每一行的唯一性。这是我在我的 java 代码中检查的基本要求,如果数据库中存在任何用于 field1、field2 和 field3 组合的条目,那么我曾经抛出 java 异常
没有两行可以重复这些值。一切都很好,直到应用程序在一些错误的业务场景下进行了测试,这些错误的业务场景在生产中永远不会发生但被错误地运行了
现在发生的情况是,如果在完全相同的实例上触发了 2 个请求,并且上面的 3 个字段完全相同(通过脚本),那么它们都会进入数据库,因为它们都将条目检查为 false
将它们全部声明为一个复合键会解决这种情况吗?
【问题讨论】:
-
您可以先在 postgres 中添加唯一约束以确保安全
标签: spring spring-data-jpa spring-data