2010-12-28 11 views
23

Jak mogę wdrożyć moje unikalne ograniczenia w POJO hibernacji? zakładając, że baza danych nie zawiera żadnych.Używanie unikalnego ograniczenia dla Hibernate JPA2

Widziałem unikalny atrybut w adnotacji @Column(), ale nie mogłem go uruchomić?
Co się stanie, jeśli chcę zastosować to ograniczenie do więcej niż jednej kolumny?

+0

jego 'C' w' @ Column', a nie 'c' !!! – KNU

Odpowiedz

32

bascially, nie można wdrożyć unique bez obsługi baz danych. Atrybut

@UniqueConstraint i unique są instrukcjami dla narzędzia generowania schematu w celu wygenerowania odpowiednich ograniczeń, nie implementują one samych ograniczeń.

Możesz wykonać pewne ręczne sprawdzenie przed wstawieniem nowych obiektów, ale w tym przypadku powinieneś zdawać sobie sprawę z możliwych problemów z równoległymi transakcjami.

Dlatego preferowane jest stosowanie ograniczeń w bazie danych.

+1

Więc aplikacja nie będzie wymuszać unikalnych ograniczeń, chyba że db jawnie je doda? Zakładam, że ddl jest wyłączony –

43

Można zadeklarować unikalnych ograniczeń pomocą @Table(uniqueConstraints = ...) adnotacji w swojej klasie

@Entity 
@Table(uniqueConstraints= 
      @UniqueConstraint(columnNames = {"surname", "name"})) 
public class SomeEntity { 
    ... 
} 
+0

Próbowałem go użyć, ale Eclipse nie może zidentyfikować tej adnotacji. –

+0

Który? @UniqueConstraint? Ta pochodzi z javax.persistence.UniqueConstraint – Hons

+1

Dodałem ograniczenie na stole, ale to nie działa –

19

W JPA2 można dodać UNIQUE bezpośrednio do pola:

@Entity 
@Table(name="PERSON_TABLE") 
public class Person{ 
    @Id 
    @Column(name = "UUID") 
    private String id; 

    @Column(name = "SOCIALSECURITY", unique=true) 
    private String socialSecurityNumber; 

    @Column(name = "LOGINID", unique=true) 
    private String loginId; 
} 

IMHO jej znacznie lepiej przypisać unikalność bezpośrednio do atrybutów niż na początku działalności stołu.

Jeśli jednak chcesz zadeklarować złożony klucz unikalny, to deklaracja w adnotacji @table jest jedyną opcją.

+0

Czy jest to wyjątkowe ograniczenie dla pojedynczej kolumny, czy też jest to wyjątkowe ograniczenie dla kombinacji socialSecurityNumber i loginId? –

+13

@StephanSchielke Tworzy oddzielne ograniczenie unikalne dla każdej kolumny. Aby utworzyć unikalne ograniczenie dla wielu pól, musisz użyć podejścia Honsa. – Naliba

Powiązane problemy