¿Cuál es la diferencia entre @UniqueConstraint y @Column (único = verdadero) ?
Por ejemplo:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Y
@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
fuente
fuente
unique=true
, el actualizador automático de esquemas no agregó el índice.@UniqueConstraint
lo hizo aparecer. Podría ser un error.Respuestas:
Como se dijo antes,
@Column(unique = true)
es un atajo paraUniqueConstraint
cuando es un solo campo.Por el ejemplo que dio, hay una gran diferencia entre ambos.
Este código implica que ambos
mask
ygroup
tienen que ser únicos, pero por separado. Eso significa que si, por ejemplo, tiene un registro con mask.id = 1 e intenta insertar otro registro con mask.id = 1 , obtendrá un error, porque esa columna debe tener valores únicos. Lo mismo se aplica al grupo.Por otra parte,
Implica que los valores de máscara + grupo combinados deben ser únicos. Eso significa que puede tener, por ejemplo, un registro con mask.id = 1 y group.id = 1 , y si intenta insertar otro registro con mask.id = 1 y group.id = 2 , se insertará con éxito, mientras que en el primer caso no lo haría.
Si desea que tanto la máscara como el grupo sean únicos por separado y para eso a nivel de clase, tendrá que escribir el código de la siguiente manera:
Esto tiene el mismo efecto que el primer bloque de código.
fuente
mask_id
ygroup_id
si usa la estrategia de nomenclatura predeterminada.De la documentación de Java EE:
Ver documento
fuente
Además de la respuesta de Booz ...
@UniqueConstraint
le permite nombrar la restricción , mientras@Column(unique = true)
genera un nombre aleatorio (por ejemploUK_3u5h7y36qqa13y3mauc5xxayq
).A veces puede resultar útil saber con qué tabla está asociada una restricción. P.ej:
fuente
Además de las respuestas de @ Boaz y @ vegemite4me ...
Al implementarlo
ImplicitNamingStrategy
, puede crear reglas para nombrar automáticamente las restricciones. Tenga en cuenta que agrega su estrategia de nomenclaturametadataBuilder
durante la inicialización de Hibernate:Funciona para
@UniqueConstraint
, pero no para@Column(unique = true)
, que siempre genera un nombre aleatorio (por ejemplo, UK_3u5h7y36qqa13y3mauc5xxayq).Hay un informe de error para resolver este problema, así que si puede, vote allí para implementarlo. Aquí: https://hibernate.atlassian.net/browse/HHH-11586
Gracias.
fuente