Was ist der Unterschied zwischen @UniqueConstraint und @Column (unique = true) ?
Beispielsweise:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Und
@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
quelle
quelle
unique=true
der Index beim Hinzufügen nicht vom automatischen Schema-Updater hinzugefügt.@UniqueConstraint
ließ es erscheinen. Könnte ein Fehler sein.Antworten:
Wie bereits erwähnt,
@Column(unique = true)
handelt es sich um eine Verknüpfung,UniqueConstraint
wenn es sich nur um ein einzelnes Feld handelt.Aus dem Beispiel, das Sie gegeben haben, gibt es einen großen Unterschied zwischen beiden.
Dieser Code impliziert, dass beide
mask
undgroup
eindeutig sein müssen, jedoch getrennt. Das heißt, wenn Sie beispielsweise einen Datensatz mit einer mask.id = 1 haben und versuchen, einen anderen Datensatz mit mask.id = 1 einzufügen , wird eine Fehlermeldung angezeigt , da diese Spalte eindeutige Werte haben sollte. Das gleiche gilt für die Gruppe.Andererseits,
Impliziert, dass die Werte von mask + group kombiniert eindeutig sein sollten. Das heißt, Sie können beispielsweise einen Datensatz mit mask.id = 1 und group.id = 1 haben. Wenn Sie versuchen, einen anderen Datensatz mit mask.id = 1 und group.id = 2 einzufügen , wird dieser eingefügt erfolgreich, während es im ersten Fall nicht wäre.
Wenn Sie möchten, dass sowohl Maske als auch Gruppe separat und auf Klassenebene eindeutig sind, müssen Sie den Code wie folgt schreiben:
Dies hat den gleichen Effekt wie der erste Codeblock.
quelle
mask_id
undgroup_id
wenn Sie die Standardbenennungsstrategie verwenden.Aus der Java EE-Dokumentation:
Siehe doc
quelle
Neben Boaz 'Antwort ....
@UniqueConstraint
Mit dieser Option können Sie die Einschränkung benennen und gleichzeitig@Column(unique = true)
einen zufälligen Namen generieren (zUK_3u5h7y36qqa13y3mauc5xxayq
. B. ).Manchmal kann es hilfreich sein zu wissen, welcher Tabelle eine Einschränkung zugeordnet ist. Z.B:
quelle
Zusätzlich zu den Antworten von @ Boaz und @ vegemite4me ....
Durch die Implementierung können
ImplicitNamingStrategy
Sie Regeln für die automatische Benennung der Einschränkungen erstellen. Beachten Sie, dass Sie Ihre NamensstrategiemetadataBuilder
während der Initialisierung von Hibernate hinzufügen :Es funktioniert für
@UniqueConstraint
, aber nicht für@Column(unique = true)
, was immer einen zufälligen Namen generiert (z. B. UK_3u5h7y36qqa13y3mauc5xxayq).Es gibt einen Fehlerbericht, um dieses Problem zu beheben. Wenn Sie können, stimmen Sie dort ab, um dies zu implementieren. Hier: https://hibernate.atlassian.net/browse/HHH-11586
Vielen Dank.
quelle