Tôi cho rằng điều đó @EmbeddedIdcó thể dài dòng hơn bởi vì @IdClassbạ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 @EmbeddedIdbạ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 @IdClassvà @EmbeddedIdlà khi viết HQL:
Với @IdClassbạn viết:
chọn e.name từ Nhân viên e
và với @EmbeddedIdbạ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á.
@IdClassdù tôi thích@EmbeddedIdtrong 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@IdClasstrườ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 đó@IdClasssẽ cho chúng tôi một cách của chúng tôi.