Tôi cho rằng điều đó @EmbeddedId
có thể dài dòng hơn bởi vì @IdClass
bạn không thể truy cập toàn bộ đối tượng khóa chính bằng bất kỳ toán tử truy cập trường nào. Sử dụng @EmbeddedId
bạn có thể làm như thế này:
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
Điều này đưa ra một khái niệm rõ ràng về các trường tạo ra khóa tổng hợp bởi vì tất cả chúng được tổng hợp trong một lớp được truy cập qua máng một toán tử truy cập trường.
Một điểm khác biệt với @IdClass
và @EmbeddedId
là khi viết HQL:
Với @IdClass
bạn viết:
chọn e.name từ Nhân viên e
và với @EmbeddedId
bạn phải viết:
chọn e.employeeId.name từ Nhân viên e
Bạn phải viết thêm văn bản cho cùng một truy vấn. Một số người có thể lập luận rằng điều này khác với một ngôn ngữ tự nhiên hơn như ngôn ngữ được quảng bá IdClass
. Nhưng hầu hết các lần hiểu ngay từ truy vấn rằng một trường nhất định là một phần của khóa tổng hợp là trợ giúp vô giá.
@IdClass
dù tôi thích@EmbeddedId
trong hầu hết các tình huống (Phải biết điều này từ một phiên của Antonio Goncalves. Ông đề nghị chúng ta có thể sử dụng@IdClass
trường hợp nào trong trường hợp tổng hợp lớp khóa không thể truy cập hoặc đến từ một mô-đun hoặc mã kế thừa khác mà chúng tôi không thể thêm chú thích. Trong các kịch bản đó@IdClass
sẽ cho chúng tôi một cách của chúng tôi.