Trang chủ » Blog » Triển khai Repository Pattern với JPA và Hibernate

Triển khai Repository Pattern với JPA và Hibernate

bởi CodeGym | 26/12/2023 15:38 | Blog

Repository Pattern

Các mẫu kho lưu trữ (Repository Pattern) là cực kỳ phổ biến. Theo cách hiểu hiện đại, nó trừu tượng hóa việc lưu trữ dữ liệu và cho phép logic nghiệp vụ của bạn xác định các hoạt động đọc và ghi ở mức logic. Nó thực hiện điều đó bằng cách cung cấp một tập hợp các phương thức để đọc, lưu trữ, cập nhật và xóa một thực thể khỏi kho lưu trữ dữ liệu cơ bản.

Nếu bạn đọc “Mô hình kiến ​​trúc ứng dụng doanh nghiệp”(Patterns of Enterprise Application Architecture) của Martin Fowler và cộng sự, bạn sẽ nhận ra sự khác biệt so với mục tiêu ban đầu của mẫu kho lưu trữ. Mục tiêu chính của nó là sự trừu tượng của mã truy cập cơ sở dữ liệu. JPA đã cung cấp sự trừu tượng này. Vì vậy, không cần một lớp khác cung cấp chức năng tương tự.

Đó là lý do tại sao việc giải thích mới về mẫu hiện cung cấp mức độ trừu tượng cao hơn và ẩn tất cả các chi tiết cụ thể của kho lưu trữ dữ liệu. Điều đó cho phép bạn thay thế một kho lưu trữ dữ liệu bằng một cơ sở dữ liệu hoàn toàn khác, ví dụ: cơ sở dữ liệu quan hệ bằng cơ sở dữ liệu NoQuery. Nhưng điều quan trọng hơn cả, tất cả các phương thức truy cập cơ sở dữ liệu cho một thực thể được xác định trong cùng một kho lưu trữ và không nằm trong các phần khác nhau của logic nghiệp vụ. Điều đó làm cho việc triển khai logic nghiệp vụ của bạn và sử dụng lại các truy vấn hoặc các hoạt động cơ sở dữ liệu khác dễ dàng hơn nhiều.

Giải thích mẫu kho lưu trữ

Mẫu kho lưu trữ khá đơn giản. Một giao diện xác định kho lưu trữ với tất cả các hoạt động đọc và ghi logic cho một thực thể cụ thể. Bạn có thể thấy một ví dụ về giao diện kho lưu trữ (repository interface) như vậy trong sơ đồ bên dưới.

Giao diện được triển khai bởi một hoặc nhiều lớp cung cấp các triển khai cụ thể lưu trữ dữ liệu của từng phương thức giao diện(interface method).

Repository Pattern

Triển khai mẫu kho lưu trữ

Trong hầu hết các dự án doanh nghiệp, bạn chỉ cần xác định các giao diện kho lưu trữ. Spring Data JPA và Apache DeltaSpike Data có thể tạo ra các triển khai kho lưu trữ tiêu chuẩn cho bạn. Bạn chỉ cần cung cấp triển khai của riêng bạn.

Xác định giao diện kho lưu trữ

Triển khai giao diện BookRepository. Nó định nghĩa 4 phương thức mà bạn có thể sử dụng để:

  • Lưu một thực thể mới hoặc thay đổi (Lưu ý rằng Hibernate tự động phát hiện và duy trì tất cả các thay đổi của các thực thể được quản lý. Vì vậy, bạn không cần phải gọi phương thức lưu sau khi bạn thay đổi bất kỳ thuộc tính thực thể nào)
  • Xóa một thực thể
  • Tìm một thực thể bằng khóa chính
  • Tìm một thực thể theo tiêu đề
package org.thoughts.on.java.repository;

import org.thoughts.on.java.model.Book;
public interface BookRepository {
   Book getBookById(Long id);
   Book getBookByTitle(String title);
   Book saveBook(Book b);
   void deleteBook(Book b);
}

Triển khai kho lưu trữ với JPA và Hibernate

Trong bước tiếp theo, bạn có thể triển khai giao diện BookRepository. Trong ví dụ này, bạn tạo ra một triển khai dựa trên JPA đơn giản.

package org.thoughts.on.java.repository;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import org.thoughts.on.java.model.Book;

public class BookRepositoryImpl implements BookRepository {

   private EntityManager em;

   public BookRepositoryImpl(EntityManager em) {
       this.em = em;
   }

   @Override
   public Book getBookById(Long id) {
       return em.find(Book.class, id);
   }

   @Override
   public Book getBookByTitle(String title) {
       TypedQuery<Book> q = em.createQuery("SELECT b FROM Book b WHERE b.title = :title", Book.class);
       q.setParameter("title", title);
       return q.getSingleResult();
   }

   @Override
   public Book saveBook(Book b) {
       if (b.getId() == null) {
           em.persist(b);
       } else {
           b = em.merge(b);
       }
       return b;
   }

   @Override
   public void deleteBook(Book b) {
       if (em.contains(b)) {
           em.remove(b);
       } else {
           em.merge(b);
       }
   }
}

Nếu bạn đã từng gọi một truy vấn JPQL hoặc duy trì một thực thể trong tầng nghiệp vụ (business) của bạn, mã triển khai kho lưu trữ ở trên sẽ trông quen thuộc. Không có sự khác biệt lớn giữa việc triển khai các hoạt động này trong mã nghiệp vụ của bạn hoặc là một phần của việc triển khai kho lưu trữ.

Trong ví dụ này, sự khác biệt đáng chú ý duy nhất là việc triển khai phương thức saveBook(Book b). Bạn có thể gọi phương thức này để duy trì một thực thể mới hoặc hợp nhất một thực thể hiện có. Vì vậy, bạn cần phát hiện xem phương thức đã được gọi với một thực thể mới hay hiện có. Trong ví dụ này, Hibernate tạo các giá trị khóa chính. Vì vậy, thuộc tính id của tất cả các thực thể mới phải là null. Nếu nó là không null, thì nó phải là một thực thể hiện có sau đó được hợp nhất vào persistence context.

Kết luận

Mẫu kho lưu trữ (Repository Pattern) là một trong những mẫu bền vững phổ biến nhất của Java. Nó cung cấp 2 lợi ích chính:

  • Mẫu trừu tượng hóa kho lưu trữ dữ liệu và cho phép bạn thay thế kho lưu trữ dữ liệu của mình mà không thay đổi mã nghiệp vụ.
  • Kho lưu trữ cải thiện khả năng sử dụng lại mã nguồn, đặc biệt là các truy vấn của bạn, bằng cách khuyến khích bạn thực hiện tất cả các hoạt động ở một nơi. Điều đó làm cho chúng dễ dàng tìm thấy và tái sử dụng.

Việc thực hiện các mẫu kho lưu trữ là tương đối đơn giản. Bạn cần một giao diện xác định các hoạt động ở mức logic. Giao diện này được thực hiện bởi một hoặc nhiều lớp lưu trữ dữ liệu cụ thể.

Author: Nguyễn Khánh Tùng

Đăng ký nhận bộ tài liệu học Java trên 2 trang giấy tại đây

Xem thêm: Java Coding Bootcamp là gì? Tổng quan về Java Coding Bootcamp

Download - Giáo trình thuật toán

2 + 15 =

Tags:

0 Lời bình

Gửi Lời bình

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

BÀI VIẾT LIÊN QUAN

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

098 953 44 58

Đăng ký tư vấn lộ trình học lập trình

Đăng ký tư vấn, định hướng lộ trình học và giải đáp các thắc mắc về ngành nghề – Miễn phí – Online.

2 + 15 =

TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM
TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM