2013-06-05 28 views
6

Người ta có thể gán khóa chính cho lớp của nó bằng cách sử dụng chú thích @Id trong JPA. Câu hỏi của tôi là nếu một người không muốn có một khóa được tạo tự động trong các bảng của mình và sử dụng các trường (có thể nhiều hơn một) làm khóa chính.Cách gán một số trường làm khóa chính của thực thể (sử dụng JPA)

Giả sử chúng ta có bảng người có SSN, NATIONALITY và NAME. SSN được định nghĩa là số mà một người được xác định ở quốc gia của mình. Vì vậy, chúng tôi có thể có hai người với cùng một số ở hai quốc gia khác nhau. Khóa chính cho bảng này có thể là SSN + NATIONALITY. Có cách nào để ánh xạ hai trường này bằng JPA và ánh xạ nó tới một đối tượng không? hoặc cách duy nhất để tạo id được tạo tự động và sử dụng chú thích @Id

CREATE TABLE PERSON (
    SSN INT, 
    NATIONALITY VARCHAR, 
    NAME VARCHAR 
) 
+0

Cảm ơn phản hồi của bạn @femtoRgon. Tôi để nó cho cộng đồng để quyết định xem nó có trùng lặp hay không. Tuy nhiên, đọc bài báo bạn đã liên kết, tôi đã nhận thấy đó là về việc tạo các tệp DDL thay vì câu hỏi cơ bản về cách chú thích một khóa tổng hợp. – sheidaei

Trả lời

10

Có, có thể. Khóa chính kết hợp bao gồm nhiều trường khóa chính. Mỗi trường khóa chính phải là một trong các loại JPA được hỗ trợ. Đối với bảng của bạn, bạn có:

@Entity @IdClass(PersonId.class) 
public class Person { 
    @Id int ssn; 
    @Id String nationality; 
    .... 
} 

Đối với thực thể có nhiều khóa, JPA yêu cầu xác định một lớp ID đặc biệt. Lớp này nên được gắn vào lớp thực thể bằng cách sử dụng chú thích @IdClass.

class PersonId { 
    int ssn; 
    String nationality; 
} 

Lớp ID phản ánh các lĩnh vực khóa chính và các đối tượng của nó có thể đại diện cho các giá trị khóa chính

+1

Tùy chọn thứ hai là sử dụng '@ EmbeddedId' - xem [Tài liệu Oracle TopLink] (http://www.oracle.com/technetwork/middleware/ias/toplink-jpa-annotations-096251.html#EmbeddedId) để biết một số ví dụ . –

+0

Cảm ơn @michal. Vì vậy, nếu tôi nhận được nó một cách chính xác lớp học đầu tiên sẽ làm công việc? Lớp thứ hai mà bạn đã đề cập là trường hợp không có bất kỳ khóa tổng hợp nào, đúng không? – sheidaei

+0

Lớp đầu tiên 'Person' đại diện cho thực thể. PersonId chỉ định lớp khóa chính kết hợp được ánh xạ tới nhiều trường hoặc thuộc tính của thực thể. – michal

Các vấn đề liên quan