TiiL Tutorials
@TinhocTiiL

Bài 10. Spring Data JPA: Mapping quan hệ một-nhiều giữa 2 bảng vào các Entity

Việc Mapping quan hệ một-nhiều giữa 2 bảng vào các Entity trong JPA/Hirbenate được thựu hiện thông qua 2 chú thích  @OneToMany và @ManyToOne trong Spring JPA .

1. One To Many annotation

Ví dụ như mình làm ứng dụng về bán hàng. Mình có chức năng thêm sản phẩm (Item) vào giỏ hàng (cart) . Trong giỏ hàng (cart) sẽ chứa nhiều sản phẩm (Items).

Như vậy quan hệ giữa giỏ hàngsản phẩmOne To Many nghĩa là 1 giỏ hàng chứa nhiều sản phẩm.

nguồn Hibernate One to Many Annotation Tutorial | Baeldung

Như vậy mối quan hệ trong database giữa Cart và Item là một nhiều. Column cart_id là khóa chính trong bảng Cart và là khóa phụ trong bảng Items.

Trong Java Web mình thể hiện mối quan hệ 1 – nhiều qua annotation @OneToMany.

Ví dụ như ta khai báo lớp Cart có quan hệ một nhiều với lớp Item như sau.

 

public class Cart {

    //...     
 
    @OneToMany(mappedBy="cart")
    private Set<Item> items;
	
    //...
}

Chúng ta sử dụng annotation @OneToMany để nói lên mối liên hệ một nhiều.

Như ví dụ trên ta có thể thấy 1 giỏ hàng (Cart) có nhiều sản phẩm Items.

Ở trên chúng ta sử dụng collection là Set vì chúng ta muốn tập hợp sản phẩm không được trùng lặp nhau.

Ta có thể sử dụng các tập hợp khác như List, Map cũng được. Tuỳ theo mục đích sử dụng mà mình chọn tập hợp cho đúng

Cụ thể, xây dựng Entiy Cart như sau:

@Entity
@Table(name="CART") // tên này trùng với tên Table trong database .
public class Cart {

    //...

    @OneToMany(mappedBy="cart") // chú ý biến cart này được khai báo trong Class Item bên dưới. Chúng phải giống y chang nhau cái tên
    private Set<Items> items;

    public Set<Items> getItems () {
      return items ;
    }
}

Xin lưu ý rằng chú thích @OneToMany được sử dụng để xác định thuộc tính trong lớp Items sẽ được sử dụng để ánh xạ biến mappedBy. Đó là lý do tại sao chúng ta có một thuộc tính có tên là “cart” trong lớp Items

Chúng ta chú ý, theo yêu cầu thì một giỏ hàng (Cart) sẽ chứa nhiều sản phẩm giống như trong database mô tả. Để làm được việc đó Ta sử dụng @OneToMany trong Class Cart, điều đó có nghĩa 1 giỏ hàng sẽ có nhiều sản phẩm (Items).

Tiếp đến ta sẽ thấy từ mappedBy = “cart”. MappedBy dùng để định nghĩa Class Cart và Class Item sẽ liên kết với nhau thông qua tên “cart”. Và bắt buộc tên “cart” phải được định nghĩa trong Class Item. MappedBy giống như là 1 cầu nối để ta có thể từ Class Cart mình gọi hàm getItems mình sẽ nhận được một danh sách Items

2. Many to One annotation

@Entity
@Table(name="ITEMS")
public class Item {
    
    //...
    @ManyToOne
    @JoinColumn(name="cart_id", nullable=false)
    private Cart cart;

    public Item() {}
    
    // getters and setters
}

It’s also important to note that the @ManyToOne annotation is associated with the Cart class variable. @JoinColumn annotation references the mapped column.

Chúng ta thấy trong lớp Cart chúng ta định nghĩa @OneToMany và mappedBy với giá trị “cart” để tạo liên kết giữa lớp Cart và Item . Để liên kết đó hoạt động thì ta cũng phải cấu hình biến “cart” trong Class Item.

Đầu tiên chúng ta sử dụng @ManyToOne và @JoinColumn để định nghĩa cho biến cart để tạo sự liên kết ngược lại giữa Class Items và Cart.Trong @JoinColumn ta định nghĩa name = “cart_id” . Cái ‘cart_id ‘ chính là column khóa phụ trong table Items mà ta định nghĩa trong database . nullable = false là ta ràng buộc dữ liệu không được phép null

 

Avatar
https://khoacntt.ntu.edu.vn/giang-vien/mai-cuong-tho

một GV Đại học. TiiL đã phụ trách một số môn học như: Lập trình Java, Phát triển web với Java, Lập trình thiết bị di động, Lập trình hệ thống nhúng và IoT.