当我使用 JPA 注释对多个列添加唯一约束时遇到问题。
我使用 PostgresSQL
我想在 3 列上添加唯一约束:“user_id”、“science_id”和“difficulty”
换句话说:我可以拥有
0, 1, "EASY"
0, 1, "HARD" <= 因为难度不同
0, 2, "EASY"
1, 2, "EASY"
但不是
0, 1, "EASY"
0, 1, "EASY" <= 不唯一
0, 2, "EASY"
1, 2, "EASY"
这是我的实体:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "user_basket",
uniqueConstraints = { @UniqueConstraint(
columnNames = { "user_id", "science_id", "difficulty" }) })
public class UserBasket {
@Id
@GeneratedValue
private Integer id;
@JsonIgnore
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@JsonIgnore
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "science_id")
private Science science;
@Enumerated(EnumType.STRING)
private Difficulty difficulty;
@Column(nullable = false, updatable = false)
@CreationTimestamp
private Timestamp addToBasket;
}
所以,我用邮递员添加:
{
"scienceId": 1,
"difficulty": "EASY"
}
并添加另一个但有另一个困难:
{
"scienceId": 1,
"difficulty": "HARD"
}
插入第二个时出现错误:
2023-09-06T16:04:00,284 ERROR [http-nio-8080-exec-4] o.h.e.j.s.SqlExceptionHelper: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « uk_5cesgns8lwu884yww505jep8t »
Détail : La clé « (science_id)=(1) » existe déjà.
2023-09-06T16:04:00,295 ERROR [http-nio-8080-exec-4] c.d.x.ExceptionHandler: could not execute statement [ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « uk_5cesgns8lwu884yww505jep8t »
Détail : La clé « (science_id)=(1) » existe déjà.] [insert into user_basket (add_to_basket,difficulty,science_id,user_id,id) values (?,?,?,?,?)]
2023-09-06T16:04:00,295 ERROR [http-nio-8080-exec-4] c.d.x.ExceptionHandler: org.springframework.dao.DataIntegrityViolationException: could not execute statement [ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « uk_5cesgns8lwu884yww505jep8t »
Détail : La clé « (science_id)=(1) » existe déjà.] [insert into user_basket (add_to_basket,difficulty,science_id,user_id,id) values (?,?,?,?,?)]; SQL [insert into user_basket (add_to_basket,difficulty,science_id,user_id,id) values (?,?,?,?,?)]; constraint [null]
非常感谢,最诚挚的问候
我认为这是因为你的
OneToOne
映射。如果我将它们更改为,@ManyToOne(fetch = FetchType.EAGER)
我就能够成功插入两条记录,只是Difficulty
不同。如果我尝试使用相同的方法执行第三条记录,Difficulty
则会出现唯一键约束错误。