Điều gì xảy ra nếu tôi quảng cáo cột cũng là một PK (hay còn gọi là mối quan hệ xác định)? Vì cột bây giờ là PK, tôi phải gắn thẻ nó bằng @Id (...).
Sự hỗ trợ nâng cao này của các số nhận dạng có nguồn gốc thực sự là một phần của nội dung mới trong JPA 2.0 (xem phần 2.4.1 Các phím chính tương ứng với các nhận dạng có nguồn gốc trong đặc tả JPA 2.0), JPA 1.0 không cho phép Id
trên một OneToOne
hoặc ManyToOne
. Với JPA 1.0, bạn phải sử dụng PrimaryKeyJoinColumn
và cũng xác định Basic
Id
ánh xạ cho cột khóa ngoại.
Bây giờ câu hỏi là: @Id + @JoinColumn có giống với @PrimaryKeyJoinColumn không?
Bạn có thể có được một kết quả tương tự nhưng sử dụng một Id
trên OneToOne
hoặc ManyToOne
là đơn giản hơn nhiều và là cách ưa thích để lập bản đồ định danh có nguồn gốc với JPA 2.0. PrimaryKeyJoinColumn
vẫn có thể được sử dụng trong chiến lược kế thừa JOINED . Dưới phần có liên quan từ thông số kỹ thuật JPA 2.0:
11.1.40 Chú thích PrimaryKeyJoinColumn
Các PrimaryKeyJoinColumn
chú thích rõ một cột khóa chính được sử dụng như một chìa khóa nước ngoài để tham gia vào một bảng khác.
Các PrimaryKeyJoinColumn
chú thích được sử dụng để tham gia bảng tiểu học của một lớp con thực thể trong JOINED
chiến lược map vào bảng chính của lớp cha của nó; nó được sử dụng trong một
SecondaryTable
chú thích để nối một bảng phụ với một bảng chính; và nó có thể được sử dụng trong OneToOne
ánh xạ trong đó khóa chính của thực thể tham chiếu được sử dụng làm khóa ngoại cho thực thể được tham chiếu [108] .
...
Nếu không có PrimaryKeyJoinColumn
chú thích nào được chỉ định cho một lớp con trong chiến lược ánh xạ JOINED, các cột khóa ngoại được giả định có cùng tên với các cột khóa chính của bảng chính của lớp cha.
...
Ví dụ: Lớp con Khách hàng và Khách hàng Có giá trị
@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }
@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends Customer { ... }
[108] Các cơ chế id dẫn xuất được mô tả trong phần 2.4.1.1 hiện được ưu tiên hơn
PrimaryKeyJoinColumn
cho trường hợp ánh xạ OneToOne.
Xem thêm
Nguồn này http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state nói rằng việc sử dụng @ManyToOne và @Id hoạt động với JPA 1.x. Ai đúng bây giờ?
Tác giả đang sử dụng phiên bản EclipseLink tương thích JPA 2.0 phát hành trước (phiên bản 2.0.0-M7 tại thời điểm bài viết) để viết một bài báo về JPA 1.0 (!). Bài viết này gây hiểu lầm, tác giả đang sử dụng thứ KHÔNG thuộc JPA 1.0.
Đối với bản ghi, hỗ trợ Id
bật OneToOne
và ManyToOne
đã được thêm vào EclipseLink 1.1 (xem thông báo này từ James Sutherland , người đồng hành EclipseLink và người đóng góp chính của sách wiki Java Persistence ). Nhưng tôi xin khẳng định, đây KHÔNG phải là một phần của JPA 1.0.