Jak wspomniano wcześniej, @Column(unique = true)
jest to skrót do, UniqueConstraint
gdy jest to tylko jedno pole.
Z podanego przykładu wynika, że między nimi jest ogromna różnica.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Ten kod oznacza, że oba mask
i group
muszą być unikalne, ale oddzielnie. Oznacza to, że jeśli na przykład masz rekord z wartością mask.id = 1 i spróbujesz wstawić inny rekord z wartością mask.id = 1 , otrzymasz błąd, ponieważ ta kolumna powinna mieć unikalne wartości. To samo dotyczy grupy.
Z drugiej strony,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Sugeruje, że połączone wartości maska + grupa powinny być niepowtarzalne. Oznacza to, że możesz mieć na przykład rekord z mask.id = 1 i group.id = 1 , a jeśli spróbujesz wstawić inny rekord z mask.id = 1 i group.id = 2 , zostanie on wstawiony pomyślnie, podczas gdy w pierwszym przypadku nie.
Jeśli chciałbyś, aby zarówno maska, jak i grupa były unikalne osobno, a do tego na poziomie klasy, musisz napisać kod w następujący sposób:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Ma to taki sam efekt jak pierwszy blok kodu.
unique=true
, indeks nie został dodany przez automatyczną aktualizację schematu.@UniqueConstraint
sprawiło, że się pojawiło. To może być błąd.