Jak wspomniano wcześniej, @Column(unique = true)
jest skrótem do UniqueConstraint
kiedy jest tylko jedno pole.
Z podanego przykładu wynika, że istnieje ogromna różnica między nimi.
@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 zarówno mask
i group
muszą być unikatowe, ale oddzielnie. Oznacza to, że jeśli na przykład masz rekord z mask.id = 1 i spróbujesz wstawić kolejny rekord z mask.id = 1, otrzymasz błąd, ponieważ kolumna powinna mieć unikalne wartości . To samo dotyczy grupy.
Z drugiej strony,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
wynika, że wartości maski + Grupa Połączone powinny być niepowtarzalne. Oznacza to, że można mieć, na przykład, zapis z mask.id = 1 i group.id = 1, a jeśli staramy się włożyć kolejną płytę z mask.id = 1 i group.id = 2, zostanie wstawiony pomyślnie, podczas gdy w pierwszym przypadku nie.
Jeśli chcesz mieć zarówno maskę i grupę być unikalne osobno i że na poziomie klasy, trzeba by napisać kod w następujący sposób:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
ten ma takie samo działanie jak pierwszy blok kodu.
Uwaga: W przypadku hibernacji 5.4, gdy dodałem wartość "unikalny = true", indeks nie został dodany przez auto-aktualizator schematu. Na ekranie wyświetlił się '@ UniqueConstraint'. To może być błąd. –