Tenho um problema ao adicionar uma restrição exclusiva em várias colunas com anotação JPA.
Eu uso PostgreSQL
Gostaria de adicionar uma restrição exclusiva em 3 colunas: "user_id", "science_id" e "difficulty"
Em outras palavras: eu posso ter
0, 1, "EASY"
0, 1, "HARD" <= porque a dificuldade é diferente
0, 2, "EASY"
1, 2, "EASY"
Mas não
0, 1, "EASY"
0, 1, "EASY" <= Não único
0, 2, "EASY"
1, 2, "EASY"
Aqui está minha entidade:
@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;
}
Então, adiciono com postman:
{
"scienceId": 1,
"difficulty": "EASY"
}
E adicione outro, mas com outra dificuldade:
{
"scienceId": 1,
"difficulty": "HARD"
}
Recebi um erro quando o segundo foi inserido:
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]
Muito obrigado Atenciosamente
Acho que é por causa de seus
OneToOne
mapeamentos. Se eu alterá-los para,@ManyToOne(fetch = FetchType.EAGER)
poderei inserir com êxito dois registros,Difficulty
sendo apenas diferentes. Se eu tentar fazer um terceiro registro com o mesmo,Difficulty
recebo o erro de restrição de chave exclusiva.