Як було сказано раніше, @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
зробив це. Може бути помилка.