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?

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.


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"}) 

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.