@UniqueConstraint и @Column (unique = true) в аннотации hibernate
в чем разница между @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;
4 ответа:
как уже было сказано,
@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
должны быть уникальными, но отдельно. Это означает, что если, например, у вас есть запись с маска.ИД = 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") } )
это имеет тот же эффект, что и первый блок кода.
из документации Java EE:
public abstract boolean unique
(необязательно) является ли свойство уникальным ключом. Это короткий путь для Ограничение uniqueconstraint аннотации на уровне таблицы и полезно, когда уникальный ключ ограничение только одно поле. Это ограничение применяется в дополнение к любому ограничению связано с сопоставлением первичного ключа и ограничениями, указанными на уровне таблицы.
посмотреть doc
в дополнение к ответу Боаза ....
@UniqueConstraint
позволяет имя ограничение, а@Column(unique = true)
генерирует случайное имя (например,UK_3u5h7y36qqa13y3mauc5xxayq
).иногда может быть полезно знать, с какой таблицей связано ограничение. Например:
@Table( name = "product_serial_group_mask", uniqueConstraints = { @UniqueConstraint( columnNames = {"mask", "group"}, name="uk_product_serial_group_mask" ) } )
в дополнение к ответам @Boaz и @vegemite4me....
введя
ImplicitNamingStrategy
вы можете создать правила для автоматического именования ограничений. Обратите внимание, что вы добавляете свою стратегию именования вmetadataBuilder
во время инициализации Hibernate:metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());
Он работает
@UniqueConstraint
, а не@Column(unique = true)
, который всегда генерирует случайное имя (например, UK_3u5h7y36qqa13y3mauc5xxayq).есть отчет об ошибке, чтобы решить эту проблему, так если вы можете, пожалуйста, голосуйте там, чтобы это было реализовано. здесь: https://hibernate.atlassian.net/browse/HHH-11586
спасибо.