2009-06-03 10 views
20

Ho due campi di una classe di entità che non voglio essere univoco ma che devono essere usati come campi compositi per una chiave che deve essere essa stessa unica. Ad esempio, ho due campi (nome e versione) che possono essere gli stessi per altri record, ma insieme devono essere unici. Qual è il modo migliore per farlo usando Hibernate (con annotazioni)? Sto usando Hibernate Validator per altri campi ma non sono sicuro di un modo per usarlo per convalidare che due campi insieme compongono una chiave univoca. Sto usando una classe di entità generica che ha un tipo generico id che può essere scambiato per una classe di chiavi composite ma devo ancora farlo funzionare molto bene.Come ottenere una chiave univoca per due campi con Hibernate?

+0

Vuoi un "vincolo univoco" su due colonne o una "chiave primaria" sulla tabella che consiste di due colonne? –

+0

Voglio un vincolo univoco su due colonne. Ad esempio la combinazione di nome e versione deve essere unica. Quindi potrei avere due record nella tabella con il record n. 1 (name = abc/version = 1) e con il record n. 2 (name = abc/version = 2), ma non due record nella tabella con il record n. 1 (nome = abc/version = 1) e con il record # 2 (name = abc/version = 1). –

risposta

37

Questo creerà una chiave univoca sul database:

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

Questo sarà applicata dal database su un aggiornamento o persistono.

Avresti bisogno di scrivere il tuo validatore personalizzato se volevi far rispettare questo usando Hibernate Validator.

+0

e cosa dovrebbe essere scritto nell'entità come pk? ... se il pk è nome e versione –

+1

@ yoav.str - Se il PK è il nome e la versione dovresti invece usare una chiave primaria composita con @ Id/@ IdClass o @ EmbeddedId/@ Embeddable – mtpettyp

+0

Questo ha funzionato per me usando Hibernate 3.6.3.Final. Grazie! – Jorge

4

Di solito i due campi vengono racchiusi in una classe di chiave interna contrassegnata come @Embeddable. Ad esempio:

@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 
    } 
} 
Problemi correlati