@UniqueConstraint und @Column(unique = true) in der Hibernate-Anmerkung

Lesezeit: 4 Minuten

Was ist der Unterschied zwischen @Einzigartige Beschränkung und @Column(eindeutig = wahr)?

Zum Beispiel:

@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;

  • 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

Benutzer-Avatar
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.

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;

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.

Auf der anderen Seite,

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

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:

@Table(
        name = "product_serial_group_mask",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = "mask"),
                @UniqueConstraint(columnNames = "group")
        }
)

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

Benutzer-Avatar
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.

Sehen Dok

  • 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


Benutzer-Avatar
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:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {
      @UniqueConstraint(
          columnNames = {"mask", "group"},
          name="uk_product_serial_group_mask"
      )
   }
)

Benutzer-Avatar
MarcG

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:

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());

Es funktioniert für @UniqueConstraintaber nicht für @Column(unique = true)der immer einen zufälligen Namen generiert (z. B. UK_3u5h7y36qqa13y3mauc5xxayq).

Es gibt einen Fehlerbericht, um dieses Problem zu lösen, also Wenn Sie können, stimmen Sie dort bitte für die Umsetzung ab. Hier:
https://hibernate.atlassian.net/browse/HHH-11586

Vielen Dank.

1323790cookie-check@UniqueConstraint und @Column(unique = true) in der Hibernate-Anmerkung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy