Как было сказано ранее, @Column(unique = true)
это ярлык, UniqueConstraint
когда это только одно поле.
Из приведенного вами примера видно, что между ними есть огромная разница.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Этот код подразумевает, что оба mask
и group
должны быть уникальными, но по отдельности. Это означает, что, например, если у вас есть запись с mask.id = 1 и вы попытаетесь вставить другую запись с mask.id = 1 , вы получите сообщение об ошибке, потому что этот столбец должен иметь уникальные значения. То же самое и для группы.
С другой стороны,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Подразумевается, что значения комбинации маска + группа должны быть уникальными. Это означает, что у вас может быть, например, запись с mask.id = 1 и group.id = 1 , и если вы попытаетесь вставить другую запись с mask.id = 1 и group.id = 2 , она будет вставлена успешно, а в первом случае - нет.
Если вы хотите, чтобы и маска, и группа были уникальными по отдельности и на уровне класса, вам нужно написать следующий код:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Это имеет тот же эффект, что и первый блок кода.
unique=true
индекс не добавлялся программой автоматического обновления схемы.@UniqueConstraint
заставил это появиться. Может быть ошибка.