2011-11-23 10 views
38

Questo è il mio modello:Creazione di un composito vincoli univoci su più colonne

class User {...} 
class Book { 
    User author; 
    int number; 
} 

Ogni numero libro dalle ore 1 per autore e con incrementi verso l'alto. Quindi avremo Libri 1,2,3 di John Grisham, Libro 1..5 di George Martin, ecc ...

Esiste un vincolo univoco che posso inserire su Book, che garantirebbe di non avere due libri con lo stesso numero dello stesso autore? Simile a @Column(unique = true), ma il vincolo si applica solo al composito di Author X number?

+0

Possibile duplicato di [Come introdurre un vincolo multi-colonna con annotazioni JPA?] (Http://stackoverflow.com/questions/2772470/how-to-introduce-multi-column-constraint-with-jpa-annotations) –

risposta

79

Uso @UniqueConstraint:

@Table(
    uniqueConstraints= 
     @UniqueConstraint(columnNames={"author_id", "number"}) 
) 
@Entity 
class Book extends Model { 
    @ManyToOne 
    @JoinColumn(name = "author_id") 
    User author; 
    int number; 
} 
+0

cosa ne pensi dell'autore e del numero @id come FK ?? –

+1

e per più uniqueConstraints compositi, la sintassi è @Table (uniqueConstraints = {@UniqueConstraint (columnNames = { "campo1", \t \t "field2", "field3"}), @UniqueConstraint (columnNames = { "Campo4", " field5 "})}) ) – Manu

+0

Aggiungendo questo vincolo univoco, l'ibernazione non è più in grado di creare la tabella quando si distribuisce l'applicazione. Puoi aiutare un po '. – Adelin

3

Quando tabella viene creato prima, è necessario rimuoverlo. La chiave univoca non viene aggiunta alla tabella esistente.