Hinweis: Mit Hibernate 5.4, wenn ich hinzugefügt habe unique=truewurde der Index nicht vom Schema-Auto-Updater hinzugefügt. @UniqueConstraint ließ es erscheinen. Könnte ein Fehler sein.
– Ondra Žižka
13. Februar 2017 um 22:10 Uhr
Glauber Nespoli
Wie schon gesagt, @Column(unique = true) ist eine Abkürzung zu 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 beides mask und group müssen eindeutig sein, aber separat. Das heißt, wenn Sie beispielsweise einen Datensatz mit a mask.id = 1 und versucht, einen weiteren Datensatz mit einzufügen mask.id = 1, erhalten Sie eine Fehlermeldung, da diese Spalte eindeutige Werte haben sollte. Gleiches gilt für die Gruppe.
Bedeutet, dass die Werte von Maske + Gruppe kombiniert eindeutig sein sollten. Das heißt, Sie können beispielsweise einen Datensatz mit haben mask.id = 1 und group.id = 1und wenn Sie versuchen, einen weiteren Datensatz mit einzufügen mask.id = 1 und group.id = 2wird es erfolgreich eingefügt, im ersten Fall jedoch nicht.
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 die gleiche Wirkung wie der erste Codeblock.
Kann ich nach dem Erstellen der eindeutigen Einschränkung in meinem JPA-Repository namentlich auf die Einschränkung verweisen, um sie abzufragen?
– WheelersWebservices
9. Januar 2018 um 18:48 Uhr
@jDub9 Sie können keinen Index abfragen. Sie können die mask- und group-Spalten in einer Abfrage abfragen, und es wird dieser Index für eine schnellere Verarbeitung verwendet (wenn Sie Glück haben), aber Sie können nicht einfach einen Index abfragen.
– Dalibor Filus
28. Februar 2019 um 17:36 Uhr
Beachten Sie jedoch, dass columnNames tatsächliche Namen in der Datenbank sein müssen. Es sollte sein mask_id und group_id wenn Sie die Standard-Benennungsstrategie verwenden.
– vitro
14. Januar 2020 um 12:25 Uhr
Boas
Aus der Java EE-Dokumentation:
public abstract boolean unique
(Optional) Ob die Eigenschaft ein eindeutiger Schlüssel ist. Dies ist eine Abkürzung für die UniqueConstraint-Anmerkung auf Tabellenebene und ist nützlich, wenn die Eindeutigkeitsschlüssel-Einschränkung nur ein einzelnes Feld ist. Diese Einschränkung gilt zusätzlich zu allen Einschränkungen, die durch die Primärschlüsselzuordnung entstehen, und zu Einschränkungen, die auf Tabellenebene angegeben sind.
Wenn ich also diesen Code verwende: @Column (unique = true) @ManyToOne (optional = false, fetch = FetchType.EAGER) private ProductSerialMask-Maske; @Column(unique = true) @ManyToOne(optional = false, fetch = FetchType.EAGER) private Group group; Ich habe zwei Indizes, aber wenn ich es anders verwende, habe ich einen Index, der aus zwei Spalten besteht?
– navid_gh
13. März 2013 um 10:33 Uhr
vegemite4me
Zusätzlich zu Boas’ Antwort ….
@UniqueConstraint erlaubt dir … zu machen Nennen Sie die Einschränkungwährend @Column(unique = true) generiert einen zufälligen Namen (zB UK_3u5h7y36qqa13y3mauc5xxayq).
Manchmal kann es hilfreich sein zu wissen, welcher Tabelle eine Einschränkung zugeordnet ist. Z.B:
Zusätzlich zu den Antworten von @Boaz und @vegemite4me….
Durch die Umsetzung ImplicitNamingStrategy Sie können Regeln für die automatische Benennung der Einschränkungen erstellen. Beachten Sie, dass Sie Ihre Namensstrategie zum hinzufügen metadataBuilder während der Initialisierung von Hibernate:
Es funktioniert für @UniqueConstraintaber nicht für @Column(unique = true)der immer einen zufälligen Namen generiert (z. B. UK_3u5h7y36qqa13y3mauc5xxayq).
Hinweis: Mit Hibernate 5.4, wenn ich hinzugefügt habe
unique=true
wurde der Index nicht vom Schema-Auto-Updater hinzugefügt.@UniqueConstraint
ließ es erscheinen. Könnte ein Fehler sein.– Ondra Žižka
13. Februar 2017 um 22:10 Uhr