Sử dụng @OneToOne annotation trong JPA

Trong JPA, để thể hiện mối quan hệ một cái này tương ứng với một cái kia, ví dụ như một khách du lịch chỉ ở một phòng duy nhất trong một khách sạn lớn, chúng ta sẽ sử dụng annotation @OneToOne. Cụ thể nó như thế nào? Trong bài viết này, chúng ta hãy cùng tìm hiểu về annotation @OneToOne trong JPA các bạn nhé!

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

Sử dụng @OneToOne annotation trong JPA

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

MySQL Connector:

Giả sử bây giờ mình có hai bảng bao gồm tourist và room với các thông tin như sau:

Như các bạn thấy, bảng room có 3 cột là id, name và hotel với primary key là cột id. Bảng tourist thì có các cột id, name và room_id với primary key là cột id. Trong bảng tourist, mình đã định nghĩa một foreign key từ bảng tourist sang bảng room với mục đích một tourist sẽ ở một phòng và một phòng chỉ có thể có một tourist ở mà thôi.

Entity cho những bảng trên có sử dụng annotation @OneToOne sẽ như sau:

Entity Tourist:

Entity Room:

Bởi vì bảng tourist có column room_id là foreign key tới bảng room nên trong entity Tourist chúng ta sẽ khai báo annotation @OneToOne cùng với một annotation khác là @JoinColumn để thể hiện mối quan hệ này.

Còn để thể hiện mối quan hệ ngược lại, một room chỉ có một tourist, mình cũng đã sử dụng annotation @OneToOne trong entity Room với thuộc tính mappedBy là room. Thuộc tính room ở đây chính là tên biến trong entity Tourist được khai báo với annotation @OneToOne.

OK, vậy là chúng ta đã hoàn thành việc khai báo annotation @OneToOne để thể hiện mối quan hệ giữa một tourist và một room. Bây giờ hãy thử làm ví dụ để xem nó làm việc 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:

Giả sử trong database mình đang có những dữ liệu sau:

Sử dụng @OneToOne annotation trong JPA

thì khi chạy ví dụ sau:

Kết quả sẽ là:

Sử dụng @OneToOne annotation trong JPA


One thought on “Sử dụng @OneToOne annotation trong JPA

  1. Trường hợp thiết kế db như này cũng có thể là OneToMany (1 phòng có nhiều Tourist ). Cho mình hỏi tại sao không thiết lập quan hệ OneTo One dựa trên khóa chính 2 bảng?

Add Comment