Qual é a diferença entre @UniqueConstraint e @Column (unique = true) ?
Por exemplo:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
E
@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
fonte
fonte
unique=true
, o índice não foi adicionado pelo atualizador automático do esquema.@UniqueConstraint
fez parecer. Pode ser um bug.Respostas:
Como disse antes,
@Column(unique = true)
é um atalho paraUniqueConstraint
quando é apenas um campo.Pelo exemplo que você deu, há uma grande diferença entre os dois.
Este código implica que ambos
mask
egroup
devem ser únicos, mas separadamente. Isso significa que se, por exemplo, você tiver um registro com mask.id = 1 e tentar inserir outro registro com mask.id = 1 , receberá um erro, porque essa coluna deve ter valores únicos. O mesmo se aplica ao grupo.Por outro lado,
Implica que os valores de máscara + grupo combinados devem ser únicos. Isso significa que você pode ter, por exemplo, um registro com mask.id = 1 e group.id = 1 , e se você tentar inserir outro registro com mask.id = 1 e group.id = 2 , ele será inserido com sucesso, enquanto no primeiro caso não o faria.
Se você quiser que a máscara e o grupo sejam únicos separadamente e no nível da classe, você terá que escrever o código da seguinte forma:
Isso tem o mesmo efeito que o primeiro bloco de código.
fonte
mask_id
egroup_id
se você usar a estratégia de nomenclatura padrão.Da documentação do Java EE:
Veja doc
fonte
Além da resposta de Boaz ....
@UniqueConstraint
permite nomear a restrição , enquanto@Column(unique = true)
gera um nome aleatório (por exemploUK_3u5h7y36qqa13y3mauc5xxayq
).Às vezes, pode ser útil saber a qual tabela uma restrição está associada. Por exemplo:
fonte
Além das respostas de @ Boaz e @ vegemite4me ....
Ao implementar,
ImplicitNamingStrategy
você pode criar regras para nomear automaticamente as restrições. Observe que você adiciona sua estratégia de nomenclatura aometadataBuilder
durante a inicialização do Hibernate:Ele funciona para
@UniqueConstraint
, mas não para@Column(unique = true)
, que sempre gera um nome aleatório (por exemplo, UK_3u5h7y36qqa13y3mauc5xxayq).Há um relatório de bug para resolver esse problema, então se você puder, vote aqui para que isso seja implementado. Aqui: https://hibernate.atlassian.net/browse/HHH-11586
Obrigado.
fonte