Composite Primary Key trong JPA với annotation @Embeddable

Composite Primary Key là những table có từ 2 cột trở lên là Primary Key. Để thể hiện chúng bằng entity trong JPA, chúng ta có thể sử dụng annotation @Embeddable. Cụ thể là như thế nào? Hãy cùng nhau tìm hiểu trong bài viết này nhé các bạn!

Đầu tiên, mình sẽ tạo một Maven project để làm ví dụ:

Composite Primary Key trong JPA với annotation @Embeddable

Mình sẽ sử dụng Hibernate làm implementation của JPA nên sẽ thêm Hibernate dependency như sau:

MySQL Connector:

Project Lombok:

Giả sử trong database mình đang có một table student với cấu trúc như sau:

Như các bạn thấy, trong table student này, mình đang định nghĩa nó có 3 cột: id, code và name; trong đó nó có 1 Composite Primary Key bao gồm 2 cột primary key: id và code.

Để thể hiện cấu trúc của table student trong entity, đầu tiên chúng ta cần định nghĩa một đối tượng chứa thông tin của Composite Primary Key trước sử dụng annotation @Embeddable. Nội dung của class này như sau:

Các bạn lưu ý là đối tượng này phải được implement interface Serializable và các phương thức equals() và hashCode() phải được khai báo. Điều này thể hiện tính duy nhất của đối tượng Composite Primary Key ứng với mỗi record của table student trong database.

Và giờ, chúng ta có thể định nghĩa entity Student sử dụng đối tượng Composite Primary Key như sau:

Trong entity Student trên, mình đã khai báo đối tượng StudentId với annotation @EmbeddedId. Annotation@EmbeddedId được sử dụng để khai báo thuộc tính primary key cho những đối tượng phức tạp gồm nhiều primary key. Với một entity đã khai báo một thuộc tính với annotation @EmbeddedId thì chúng ta không được sử dụng annotation @Id trong entity đó nữa.

OK, vậy là chúng ta đã định nghĩa xong entity Student với Composite Primary Key. Giờ, mình sẽ làm một ví dụ để xem nó hoạt động như thế nào nhé các bạn!

Mình sẽ thêm tập tin cấu hình cho JPA, persistence.xml, nằm trong thư mục /src/main/resources/META-INF với nội dung như sau:

Tiếp theo, mình tạo mới một class ví dụ. Trong class này, mình sẽ sử dụng đối tượng EntityManager để tìm kiếm trong table student những record có những cột primary key bằng những giá trị nào đó. Id lúc này sẽ là đối tượng StudentId.

Cụ thể như sau:

Nếu như trong database, mình đang có dữ liệu như sau:

Composite Primary Key trong JPA với annotation @Embeddable

thì khi chạy, kết quả sẽ như sau:

Composite Primary Key trong JPA với annotation @Embeddable


Add Comment