with example ejemplo anotaciones annotation java hibernate hibernate-annotations

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