Phân trang với spring và thymeleaf

Người dịch: Dương Xuân Long - Học viên lớp Java10
Email liên hệ: linesco218@gmail.com
Bài viết gốc: baeldung.com
Link Source code: github.com

1. Tổng quan

Mối liên kết JPA có thể là một chiều hoặc hai chiều .Điều này có nghĩa là chúng ta có thể mô phỏng chúng như một tính chất ở đúng một thực thể (Entity )liên kết hoặc cả hai.

Định nghĩa hướng của mối quan hệ giữa những thực thể không có ảnh hưởng gì tới sự soạn thảo của cơ sở dữ liệu.

Với mối quan hệ hai chiều, ta định nghĩa hai mục:

bên sở hữu
bên tham chiếu
@JoinColumn giúp chúng ta chỉ rõ cột mà chúng ta sẽ dùng để ghép một liên kết thự thể. Bên cạnh đó kí hiệu mappedBy được dùng để định nghĩa bên tham chiếu.

Trong bài hướng dẫn nhanh này chúng ta sẽ thấy sự khác nhau giữa @JoinColumn và mappedBy.

2. Thiết lập ban đầu

Ban đầu có hai thực thể: Employee và Email.

Rõ ràng rằng một employee có thể có nhiều email nhưng một email chỉ có thể thuộc về một người.

Suy ra đây là mối quan hệ 1 nhiều.

ảnh p2

Trong thực thể email sẽ có một khóa ngoại employee_id tham chiếu tới đặc tính id của employee.

3. Kí hiệu @JoinColumn

Trong mối quan hệ 1 nhiều bên sở hữu thường được định nghĩa bên nhiều của mối quan hệ.Là bên sở hữu khóa ngoại.

Kí hiệu @JoinColumn định nghĩa sự liên kết bên sở hữu.

@Entity
public class Email {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id")
    private Employee employee;

    ...}

Có nghĩa là thực thể email sẽ có một khóa ngoại employee_id tham chiếu tới đặc tính id của employee.

4. Kí hiệu mappedBy

Khi chúng ta địnhn nghĩa ở bên sơ hữu database đã có đủ dữ liệu để phác thảo ra mối quan hệ trong danh sách.

Để làm mối liên kết này hai chiều,tất cả chúng ta cần làm là định nghĩa bên tham chiếu.

Chúng ta sẽ sử dụng mappedBy để làm.

Định nghĩa thực thể employee

@Entity
public class Employee {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Long id;

   @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
   private List<Email> emails;
   
   // ...
}

Vậy giá trị của mappedby là tên của đặc tính liên kết bên sở hữu.

5. Kết luận

Kí hiệu @JoinColumn định nghĩa sự phác thảo bên sở hữu.Bên cạnh đó bên tham chiếu được định nghĩa bởi mappedBy.