В чем разница между @UniqueConstraint и @Column (unique = true) ?
Например:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
И
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
java
hibernate
hibernate-annotations
navid_gh
источник
источник
unique=true
индекс не добавлялся программой автоматического обновления схемы.@UniqueConstraint
заставил это появиться. Может быть ошибка.Ответы:
Как было сказано ранее,
@Column(unique = true)
это ярлык,UniqueConstraint
когда это только одно поле.Из приведенного вами примера видно, что между ними есть огромная разница.
Этот код подразумевает, что оба
mask
иgroup
должны быть уникальными, но по отдельности. Это означает, что, например, если у вас есть запись с mask.id = 1 и вы попытаетесь вставить другую запись с mask.id = 1 , вы получите сообщение об ошибке, потому что этот столбец должен иметь уникальные значения. То же самое и для группы.С другой стороны,
Подразумевается, что значения комбинации маска + группа должны быть уникальными. Это означает, что у вас может быть, например, запись с mask.id = 1 и group.id = 1 , и если вы попытаетесь вставить другую запись с mask.id = 1 и group.id = 2 , она будет вставлена успешно, а в первом случае - нет.
Если вы хотите, чтобы и маска, и группа были уникальными по отдельности и на уровне класса, вам нужно написать следующий код:
Это имеет тот же эффект, что и первый блок кода.
источник
mask_id
иgroup_id
при использовании по умолчанию стратегии именования.Из документации Java EE:
См. Документ
источник
В дополнение к ответу Вооза ....
@UniqueConstraint
позволяет назвать ограничение , а@Column(unique = true)
генерирует случайное имя (напримерUK_3u5h7y36qqa13y3mauc5xxayq
).Иногда может быть полезно узнать, с какой таблицей связано ограничение. Например:
источник
В дополнение к ответам @ Boaz и @ vegemite4me ....
Реализуя,
ImplicitNamingStrategy
вы можете создавать правила для автоматического именования ограничений. Обратите внимание, что вы добавляете свою стратегию именованияmetadataBuilder
во время инициализации Hibernate:Он работает
@UniqueConstraint
, но не для@Column(unique = true)
, который всегда генерирует случайное имя (например, UK_3u5h7y36qqa13y3mauc5xxayq).Для решения этой проблемы существует отчет об ошибке, поэтому, если вы можете, проголосуйте, чтобы это было реализовано. Здесь: https://hibernate.atlassian.net/browse/HHH-11586
Спасибо.
источник