java - example - hibernate-annotations maven
@UniqueConstraint y @Column(unique=true) en la anotaciĆ³n de hibernaciĆ³n (4)
Además de la respuesta de Boaz ...
@UniqueConstraint
permite nombrar la restricción , mientras que @Column(unique = true)
genera un nombre aleatorio (por ej. UK_3u5h7y36qqa13y3mauc5xxayq
).
A veces puede ser útil saber con qué tabla está asociada una restricción. P.ej:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(
columnNames = {"mask", "group"},
name="uk_product_serial_group_mask"
)
}
)
¿Cuál es la diferencia entre @UniqueConstraint y @Column (unique = true) ?
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;
Además de las respuestas de @ Boaz y @ vegemite4me ...
Al implementar ImplicitNamingStrategy
, puede crear reglas para nombrar automáticamente las restricciones. Tenga en cuenta que agrega su estrategia de nombres al metadataBuilder
durante la inicialización de Hibernate:
metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());
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, por lo tanto, si puede, vote allí para implementarlo. Aquí: https://hibernate.atlassian.net/browse/HHH-11586
Gracias.
Como se dijo antes, @Column(unique = true)
es un atajo a UniqueConstraint
cuando es solo un campo.
Por el ejemplo que dio, hay una gran diferencia entre ambos.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Este código implica que tanto la mask
como el group
deben ser únicos, pero por separado. Eso significa que si, por ejemplo, tiene un registro con una máscara.id = 1 e intenta insertar otro registro con mask.id = 1 , obtendrá un error, porque esa columna debe tener valores únicos. Lo mismo es válido para el grupo.
Por otra parte,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Implica que los valores de mask + group 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 la máscara y el grupo sean únicos por separado y a nivel de clase, debe escribir el código de la siguiente manera:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Esto tiene el mismo efecto que el primer bloque de código.
De la documentación de Java EE:
public abstract boolean unique
(Opcional) Si la propiedad es una clave única. Este es un acceso directo para la anotación UniqueConstraint a nivel de tabla y es útil para cuando la restricción de clave única es solo un campo individual. Esta restricción se aplica además de cualquier restricción implícita en la asignación de clave primaria y las restricciones especificadas en el nivel de la tabla.
Ver doc