问题描述
我在实现过程中遇到了一个棘手的问题,我要使用Spring数据JpaRepository将数据持久化到Postgressql DB中
在我的Entity类中,我有以下几列:
@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",length = 16)
private String field2;
@Column(name = "field3",length = 16)
private String field3;
起初我避免将上面的字段声明为复合字段,因为有许多字段要作为复合键处理。我以为Java代码检查会在所有情况下都能解决问题
因此,基本上,我必须基于field1,field2和field3保持每一行的唯一性。那是我在Java代码中检查的基本要求,即如果DB1中存在field1,field2和field3的组合,那么我曾经抛出过Java异常
没有两行可以重复这些值。一切都很好,直到在某些错误的业务场景下对应用程序进行了测试为止,这种情况在生产中永远不会发生,但是会被错误地运行
现在发生的是,如果在完全相同的实例上触发了2个请求,并且上面的3个字段完全相同(通过脚本),则它们都进入了数据库,因为它们都获得了错误的输入检查
解决方法
除了JPA约束,您还应该在数据库中定义唯一约束。
@Entity
@Table(uniqueConstraints={
@UniqueConstraint(columnNames = {"field1","field2","field3"})
})
public class MyEntity {
...
}