Jaka jest różnica między @UniqueConstraint i @Column (unique = true) ?
Na przykład:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
I
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
java
hibernate
hibernate-annotations
navid_gh
źródło
źródło
unique=true
, indeks nie został dodany przez automatyczną aktualizację schematu.@UniqueConstraint
sprawiło, że się pojawiło. To może być błąd.Odpowiedzi:
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.
Ten kod oznacza, że oba
mask
igroup
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,
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:
Ma to taki sam efekt jak pierwszy blok kodu.
źródło
mask_id
igroup_id
jeśli używasz domyślnej strategii nazewnictwa.Z dokumentacji Java EE:
Zobacz dok
źródło
Oprócz odpowiedzi Boaza ...
@UniqueConstraint
pozwala nazwać ograniczenie , podczas gdy@Column(unique = true)
generuje losową nazwę (npUK_3u5h7y36qqa13y3mauc5xxayq
.).Czasami warto wiedzieć, z jaką tabelą jest skojarzone ograniczenie. Na przykład:
źródło
Oprócz odpowiedzi @ Boaz i @ vegemite4me ....
Wdrażając
ImplicitNamingStrategy
możesz stworzyć reguły automatycznego nazywania ograniczeń. Zauważ, że dodajesz swoją strategię nazewnictwa dometadataBuilder
podczas inicjalizacji Hibernate:Działa dla
@UniqueConstraint
, ale nie dla@Column(unique = true)
, które zawsze generuje losową nazwę (np. UK_3u5h7y36qqa13y3mauc5xxayq).Istnieje raport o błędzie, aby rozwiązać ten problem, więc jeśli możesz, zagłosuj tam, aby to zaimplementować. Tutaj: https://hibernate.atlassian.net/browse/HHH-11586
Dzięki.
źródło