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.
@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 beide mask
und group
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,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
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:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Dies hat den gleichen Effekt wie der erste Codeblock.
unique=true
der Index beim Hinzufügen nicht vom automatischen Schema-Updater hinzugefügt.@UniqueConstraint
ließ es erscheinen. Könnte ein Fehler sein.