2009-06-03 18 views
20

Mam dwa pola klasy encji, które nie powinny być unikatowe, ale zamiast tego powinny być używane jako pola złożone dla klucza, który sam musi być unikalny. Na przykład mam dwa pola (nazwę i wersję), które mogą być takie same dla innych rekordów, ale razem muszą być unikalne. Jaki jest najlepszy sposób na to, używając Hibernate (z adnotacjami)? Używam Hibernate Validator dla innych pól, ale nie jestem pewien, w jaki sposób użyć tego do sprawdzenia, czy dwa pola razem tworzą unikalny klucz. Używam ogólnej klasy encji, która ma ogólny typ identyfikatora, który można zamienić na klasę klucza złożonego, ale muszę jeszcze sprawić, aby działała bardzo dobrze.Jak uzyskać unikalny klucz dla dwóch pól z Hibernacja?

+0

Czy chcesz "wyjątkowe ograniczenie" na dwóch kolumnach lub "klucz podstawowy" na stole, który składa się z dwóch kolumn? –

+0

Chcę unikalne ograniczenie na dwie kolumny. Na przykład kombinacja nazwy i wersji musi być unikalna. Tak więc mógłbym mieć dwa zapisy w tabeli z rekordem nr 1 (imię = abc/wersja = 1) i z rekordem nr 2 (imię = abc/wersja = 2), ale nie dwa rekordy w tabeli z rekordem nr 1 (nazwa = abc/version = 1) i z rekordem # 2 (name = abc/version = 1). –

Odpowiedz

37

To stworzy unikalny klucz w bazie danych:

@Table(name = "MYTABLE", 
     uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME", "VERSION" }) }) 

To będzie egzekwowane przez bazę danych na aktualizację lub utrzymywać.

Musisz napisać własny, niestandardowy weryfikator, jeśli chcesz wymusić to za pomocą narzędzia Hibernate Validator.

+0

i co powinno być napisane w encji jako pk? ... jeśli pk jest nazwą i wersją –

+1

@ yoav.str - Jeśli PK jest nazwą i wersją, powinieneś zamiast tego użyć złożonego klucza podstawowego z @ Id/@ IdClass lub @ EmbeddedId/@ Embeddable – mtpettyp

+0

To działało dla mnie przy użyciu Hibernuj 3.6.3.Final. Dzięki! – Jorge

4

Zazwyczaj zawijamy dwa pola w wewnętrznej klasie klucza oznaczonej jako @Embeddable. Na przykład:

@Entity 
public class Foo { 

    @EmbeddedId() 
    private Key key; 
    ... 

    @Embeddable 
    public static class Key { 
    @Column(nullable=false) 
    private String name; 
    @Column(nullable=false) 
    private int version; 

    protected Key() { 
     // for hibernate 
    } 
    public Key (String name, int version) { 
     this.name = name; 
     this.version = version; 
    } 
    ... 
    // You probably want .equals and .hashcode methods 
    } 
} 
Powiązane problemy