2010-05-05 10 views
51

Staram się wprowadzić wiele ograniczenie klucza na JPA odwzorowany jednostki:Jak wprowadzić wiązanie wielolinowe z adnotacjami 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 (produkt, szeregowe) para powinna być unikalna, ale tylko znaleźć sposób, aby powiedzieć, że seryjny powinien być unikalny . To oczywiście nie jest dobry pomysł, ponieważ różne produkty mogą mieć te same numery seryjne.

Czy istnieje sposób generowania tego ograniczenia przez JPA, czy jestem zmuszony ręcznie utworzyć go w DB?

Odpowiedz

110

Można zadeklarować unikalnych ograniczeń pomocą @Table(uniqueConstraints = ...) adnotacji w swojej klasie jednostki, tj

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

Należy pamiętać, że to nie magicznie tworzą niepowtarzalny ograniczenie w bazie danych, trzeba jeszcze DDL na to, aby być tworzone . Ale wygląda na to, że używasz jakiegoś automatycznego narzędzia do tworzenia bazy danych na podstawie definicji jednostek JPA.

+0

Czy takie rzeczy potrzebnych do istniejącej bazy danych z ograniczeniami już na miejscu? – Rob

33

Jak już wspomniano, indeks z wieloma kolumnami można dodać, używając adnotacji @Table. Jednak columnNames musi być nazwą rzeczywistych kolumn DB, a nie atrybutem klasy. Tak więc, jeśli kolumna jest jak następuje:

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

Następnie @Table adnotacja powinna być jak na poniższym

@Table(uniqueConstraints= 
     @UniqueConstraint(columnNames = {"product_id", "serial"}) 
+3

To jest bardzo ważne wyjaśnienie: nazwy tabel, a nie nazwy obiektów. – Calabacin

Powiązane problemy