Quelle est la différence entre @UniqueConstraint et @Column (unique = true) ?
Par exemple:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Et
@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
la source
la source
unique=true
, l'index n'a pas été ajouté par le programme de mise à jour automatique du schéma.@UniqueConstraint
l'a fait apparaître. Cela pourrait être un bug.Réponses:
Comme dit précédemment,
@Column(unique = true)
est un raccourci versUniqueConstraint
quand il ne s'agit que d'un seul champ.D'après l'exemple que vous avez donné, il y a une énorme différence entre les deux.
Ce code implique que les deux
mask
etgroup
doivent être uniques, mais séparément. Cela signifie que si, par exemple, vous avez un enregistrement avec un mask.id = 1 et essayez d'insérer un autre enregistrement avec mask.id = 1 , vous obtiendrez une erreur, car cette colonne doit avoir des valeurs uniques. La même chose vaut pour le groupe.D'autre part,
Implique que les valeurs de masque + groupe combinées doivent être uniques. Cela signifie que vous pouvez avoir, par exemple, un enregistrement avec mask.id = 1 et group.id = 1 , et si vous essayez d'insérer un autre enregistrement avec mask.id = 1 et group.id = 2 , il sera inséré avec succès, alors que dans le premier cas non.
Si vous souhaitez que le masque et le groupe soient uniques séparément et au niveau de la classe, vous devez écrire le code comme suit:
Cela a le même effet que le premier bloc de code.
la source
mask_id
etgroup_id
si vous utilisez la stratégie de dénomination par défaut.À partir de la documentation Java EE:
Voir doc
la source
En plus de la réponse de Boaz ...
@UniqueConstraint
vous permet de nommer la contrainte , tandis que@Column(unique = true)
génère un nom aléatoire (par exempleUK_3u5h7y36qqa13y3mauc5xxayq
).Parfois, il peut être utile de savoir à quelle table une contrainte est associée. Par exemple:
la source
En plus des réponses de @ Boaz et @ vegemite4me ....
En mettant en œuvre,
ImplicitNamingStrategy
vous pouvez créer des règles pour nommer automatiquement les contraintes. Notez que vous ajoutez votre stratégie de dénomination aumetadataBuilder
lors de l'initialisation d'Hibernate:Cela fonctionne pour
@UniqueConstraint
, mais pas pour@Column(unique = true)
, qui génère toujours un nom aléatoire (par exemple UK_3u5h7y36qqa13y3mauc5xxayq).Il existe un rapport de bogue pour résoudre ce problème, donc si vous le pouvez, veuillez voter pour que cela soit implémenté. Ici: https://hibernate.atlassian.net/browse/HHH-11586
Merci.
la source