Sử dụng annotation @ManyToOne trong JPA

Annotation @ManyToOne trong JPA được dùng để thể hiện mối quan hệ nhiều – một giữa hai bảng trong một database nào đó. Ở đó, nhiều record trong bảng A có mối quan hệ với một record trong bảng B. Ví dụ như: nhiều sinh viên khác nhau có thể có cùng lớp học. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu sâu về annotation này nhé các bạn!

Để dễ hình dung, mình sẽ lấy mối quan hệ giữa sinh viên và lớp học để làm ví dụ. Cấu trúc database của hai bảng này như sau:

OK …

  • Đầu tiên, mình sẽ tạo một project để làm việc với ví dụ này như sau:

Sử dụng annotation @ManyToOne trong JPA

với dependency như sau:

Vì trong ví dụ này, mình làm việc với MySQL nên mình cũng sẽ thêm dependency cho MySQL Driver:

  • Tiếp theo, mình sẽ tạo 2 entity thể hiện 2 bảng clazzstudent.

Sử dụng annotation @ManyToOne trong JPA

Nội dung của entity Clazz lúc này như sau:

và entity Student:

  • Bây giờ, chúng ta sẽ sử dụng annotation @ManyToOne để thể hiện mối quan hệ nhiều – một giữa hai entity StudentClazz nhé các bạn.

Bởi vì, đây là mối quan hệ nhiều – một nhìn từ đối tượng sinh viên, do đó chúng ta sẽ đặt annotation @ManyToOne trong entity Student.

Mình sẽ thêm một field mới trong entity Student sử dụng với annotation @ManyToOne như sau:

Ở đây, mình chỉ dùng duy nhất một annotation @ManyToOne, ngoài ra không dùng bất kỳ cấu hình nào khác. Do đó, các cấu hình mặc định cho annotation này sẽ được sử dụng. Mình sẽ nói cho các bạn biết các giá trị đó là gì?

Như các bạn đã biết, trong một database bất kỳ, khái niệm mối quan hệ có nghĩa là một bảng trong database này có mối liên hệ với một bảng khác cũng trong database này luôn. Và khi một cột trong bảng này tham chiếu tới một khóa chính (thường là primary key) của bảng kia thì chúng ta gọi cột này là cột foreign key.

Trong JPA, nếu các bạn chỉ sử dụng duy nhất annotation @ManyToOne, thì tên của cột foreign key này sẽ được định nghĩa bằng một tên mặc định. Tên mặc định này sẽ được xây dựng dựa vào 2 entity. Nó là tên của biến mà chúng ta định nghĩa mối quan hệ giữa 2 entity với annotation @ManyToOne, trong ví dụ của chúng ta là biến clazz trong entity Student, theo sau là dấu gạch dưới và cuối cùng là tên của biến đóng vai trò là primary key trong entity kia, trong ví dụ này thì đó là biến id trong entity Clazz.

Do vậy, ở ví dụ này của chúng ta thì cột foreign key này sẽ có tên là clazz_id nằm trong bảng student.

Trong trường hợp, cột foreign key trong bảng student không trùng với tên mặc định được định nghĩa bởi JPA thì các bạn cần phải sử dụng thêm một annotation khác có tên là @JoinColumn để định nghĩa cột foreign key. Trong annotation này, chúng ta có một attribute là name để định nghĩa tên của cột foreign key. Trong ví dụ của chúng ta, chúng ta có thể thêm annotation @JoinColumn như sau:

Hiện tại, trong bảng student chúng ta đã định nghĩa cột foreign key là clazz_id trùng với tên mặc định nên bây giờ chúng ta có thể sử dụng 2 entity ở trên rồi.

  • Để làm việc với JPA, chúng ta cần phải thêm một tập tin cấu hình cho JPA, persistence.xml, nằm trong thư mục /src/main/resources/META-INF của project.

Sử dụng annotation @ManyToOne trong JPA

với nội dung như sau:

  • Giờ, mình sẽ viết code để thêm một lớp học với hai sinh viên như sau:

Kết quả:

Sử dụng annotation @ManyToOne trong JPA

Như các bạn thấy, khi insert dữ liệu vào database, id của class A đã được tự động set vào giá trị của cột clazz_id trong bảng student.

2.6/5 - (8 bình chọn)

5 thoughts on “Sử dụng annotation @ManyToOne trong JPA

  1. Anh cho em hỏi, Em có 2 bảng kết nối với nhau: sale_order onetomany sale_orderline ,
    Em có thể lôi được hết dữ liệu của bảng sale_order khi dùng sale_orderline để gọi, Nhưng em không thể dùng sale_order để lỗi dữ liệu của bảng sale_orderline ra được, anh có cách nào có thể giúp em không ạ. Em cảm ơn

  2. Anh ơi. khi mình đã có cột id của bảng khác nhưng mình ko muốn lấy cột id của bảng đó mà muốn lấy cột name của bảng đó chẳng hạn thì cần làm ntn vậy a

  3. mình rút ra được một kết luận thông qua các bài viết của anh khanh là khi ta đứng ở một thì lấy được danh sách của nhiều tương ứng, còn đứng ở nhiều thì lấy được đối tượng của một.

Add Comment