2010-05-05 4 views
51

Tôi cố gắng để giới thiệu một hạn chế đa-key trên một thực thể JPA ánh xạ:Làm thế nào để giới thiệu đa cột ràng buộc với chú thích JPA?

public class InventoryItem { 
    @Id 
    private Long id; 

    @Version 
    private Long version; 

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

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

Về cơ bản (sản phẩm, nối tiếp) cặp phải là duy nhất, nhưng tôi chỉ tìm thấy một cách để nói rằng sê-ri phải là duy nhất . Điều này rõ ràng không phải là một ý tưởng tốt vì các sản phẩm khác nhau có thể có cùng số sê-ri.

Có cách nào để tạo ràng buộc này thông qua JPA hoặc tôi buộc phải tạo thủ công cho DB không?

Trả lời

110

Bạn có thể khai báo các ràng buộc duy nhất bằng cách sử dụng @Table(uniqueConstraints = ...) chú thích trong lớp thực thể của bạn, ví dụ:

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

Lưu ý rằng điều này không kỳ diệu tạo ra các hạn chế duy nhất trong cơ sở dữ liệu, bạn vẫn cần một DDL cho nó được tạo ra . Nhưng có vẻ như bạn đang sử dụng một số loại công cụ tự động để tạo cơ sở dữ liệu dựa trên các định nghĩa thực thể JPA.

+0

là loại điều này cần thiết cho một cơ sở dữ liệu hiện có với các ràng buộc đã được tại chỗ? – Rob

33

Như đã trả lời, chỉ mục nhiều cột có thể được thêm bằng cách sử dụng chú thích @Table. Tuy nhiên, columnNames cần phải là tên của các cột DB thực tế, không phải là thuộc tính lớp. Vì vậy, nếu cột là như sau:

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

Sau đó @Table chú thích nên như sau

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

Đây là cách làm rõ rất quan trọng: tên bảng và không phải tên đối tượng. – Calabacin