Làm thế nào để giới thiệu ràng buộc nhiều cột với chú thích JPA?


91

Tôi đang cố gắng giới thiệu một ràng buộc đa khóa trên một thực thể được ánh xạ 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, cặp (sản phẩm, nối tiếp) phải là duy nhất, nhưng tôi chỉ tìm thấy một cách để nói rằng nối tiếp phải là duy nhất. Đây rõ ràng không phải là một ý tưởng hay 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 hay tôi buộc phải tạo nó theo cách thủ công cho DB?

Câu trả lời:


190

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 mình, tức là

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

Lưu ý rằng điều này không tạo ra ràng buộc duy nhất một cách kỳ diệu trong cơ sở dữ liệu, bạn vẫn cần một DDL để nó được tạo. 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.


1
Loại thứ này có cần thiết cho một cơ sở dữ liệu hiện có với các ràng buộc đã có sẵn không?
Rob

Tôi tin rằng ràng buộc sẽ được tạo ra do nhà cung cấp JPA đang tạo cơ sở dữ liệu.
AlanObject

Tính duy nhất dành cho cột (productId) & (serial) hay cho ràng buộc của 2 cột trong tổng số (productId, serial)?
P Satish Patro

69

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

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

Sau đó, @Tablechú thích sẽ giống như sau

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

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

1
Tính duy nhất dành cho cột (productId) & (serial) hay cho ràng buộc của 2 cột trong tổng số (productId, serial)?
P Satish Patro

Kotlin: Hãy xem câu trả lời này để tìm ví dụ cho kotlin: stackoverflow.com/a/47000044/285431
Dirk

Lỗi cú pháp. Bạn đang thiếu dấu ngoặc đóng trên chú thích @Table.
Evvo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.