Jak wprowadzić ograniczenie wielokolumnowe w adnotacjach JPA?

91

Próbuję wprowadzić ograniczenie wieloprzyciskowe na obiekt mapowany na JPA:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

Zasadniczo para (produkt, numer seryjny) powinna być unikalna, ale znalazłem tylko sposób, aby powiedzieć, że seria powinna być unikalna. To oczywiście nie jest dobry pomysł, ponieważ różne produkty mogą mieć takie same numery seryjne.

Czy istnieje sposób na wygenerowanie tego ograniczenia przez JPA, czy jestem zmuszony do ręcznego utworzenia go w bazie danych?

plouh
źródło

Odpowiedzi:

190

Możesz zadeklarować unikalne ograniczenia za pomocą @Table(uniqueConstraints = ...)adnotacji w swojej klasie encji, tj

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}

Zauważ, że nie tworzy to w magiczny sposób unikalnego ograniczenia w bazie danych, nadal potrzebujesz DDL do jego utworzenia. Ale wygląda na to, że używasz jakiegoś zautomatyzowanego narzędzia do tworzenia bazy danych w oparciu o definicje jednostek JPA.

psp
źródło
1
Czy jest to potrzebne w przypadku istniejącej bazy danych z już istniejącymi ograniczeniami?
Rob
Wierzę, że ograniczenie powstanie, dostawca WZP tworzy bazę danych.
AlanObject
Unikalność dotyczy (productId) kolumny i (serial) kolumny lub ograniczenia 2 kolumn łącznie (productId, serial)?
P Satish Patro
69

Jak już odpowiedziałem, indeks wielokolumnowy można dodać za pomocą @Tableadnotacji. Jednak columnNamesmusi to być nazwa rzeczywistych kolumn bazy danych, a nie atrybut klasy. Tak więc, jeśli kolumna wygląda następująco:

@Column(name="product_id")
Long productId;

Następnie @Tableadnotacja powinna wyglądać następująco

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 
SJha
źródło
10
To bardzo ważne wyjaśnienie: nazwy tabel, a nie nazwy obiektów.
Calabacin
1
Unikalność dotyczy (productId) kolumny i (serial) kolumny lub ograniczenia 2 kolumn łącznie (productId, serial)?
P Satish Patro
Kotlin: Spójrz na tę odpowiedź, aby znaleźć przykład dla kotlin: stackoverflow.com/a/47000044/285431
Dirk
Błąd składni. Brakuje nawiasu zamykającego w adnotacji @Table.
Evvo,