Giới thiệu về Spring Data JPA – Tại sao cần sử dụng nó?
NỘI DUNG BÀI VIẾT
Spring Data là một module của Spring Framework. Mục đích của Spring Data JPA là giảm thiểu việc thực hiện quá nhiều bước để có thể implement được JPA. Spring Data JPA là một phần của Spirng Data và nó hỗ trợ Hibernate 5, OpenJPA 2.4 và EclipseLink 2.6.1.
Vậy thực sự Spring Data JPA là gì? Chúng ta cùng nhau tìm hiểu về nó nhé!
1. Tổng quan về Spring Data JPA
Trong bài hướng dẫn này sẽ tập trung vào giới thiệu Spring Data JPA trong 1 Spring project và cấu hình đầy đủ tầng persistence. Bạn có thể xem bài viết này để hiểu hơn về cách sử dụng của Spring Data JPA nhé.
2. Spring Data Generated DAO – No More DAO Implementations
Như chúng ta đã biết thì class DAO thường bao gồm rất nhiều code được viết sẵn và cần phải đơn giản hóa nó đi. Những lợi thế của việc đơn giản hóa như vậy rất nhiều: giảm số lượng tương tác mà chúng ta cần xác định và duy trì, tính nhất quán của mẫu truy cập dữ liệu và cấu hình.
Spring Data đưa sự đơn giản hóa này lên một bước nữa và có thể loại bỏ hoàn toàn việc triển khai DAO. Interface DAO hiện là các thao tác duy nhất mà chúng ta cần define rõ ràng.
Để bắt đầu tận dụng Spring Data programming model với JPA, một interface DAO cần extends JPA specific Repository interface, JpaRepository. Điều này cho phép Spring Data tìm thấy interface này và tự động tạo 1 implementation cho nó.
Bằng cách extends interface, chúng ta nhận được các method CRUD phù hợp nhất để truy cập dữ liệu tiêu chuẩn có sẵn trong một DAO tiêu chuẩn.
3. Custom Access Method và Queries
Như đã thảo luận, bằng cách implement một trong các Repository interfaces, DAO sẽ có một số method CRUD cơ bản (và truy vấn) được define và implement.
Để define các method truy cập cụ thể hơn, Spring JPA hỗ trợ khá nhiều tùy chọn:
- chỉ cần define một method mới trong interface.
- cung cấp query JPQL bằng cách sử dụng annotation @Query
- sử dụng Specification nâng cao và Querydsl hỗ trợ trong Spring Data
- define custom queries thông qua JPA Named Queries
Tổng hợp 200+ tài liệu, sách, bài thực hành, video hướng dẫn lập trình… từ cơ bản đến nâng cao
Ở cách sử dụng Specification nâng cao và Querydsl hỗ trợ, tương tự như JPA Criteria, nhưng sử dụng một API linh hoạt và tiện lợi. Điều này làm cho toàn bộ hoạt động dễ đọc hơn và có thể tái sử dụng.
Ưu điểm của API này sẽ trở nên rõ ràng hơn khi xử lý một số lượng lớn các truy vấn cố định.
Vì tôi có thể diễn đạt những điều này một cách ngắn gọn hơn thông qua một số lượng nhỏ các khối có thể tái sử dụng.
Tùy chọn cuối cùng có nhược điểm là nó liên quan đến XML hoặc tạo gánh nặng cho class domain với các truy vấn.
3.1. Automatic Custom Queries
Khi Spring Data tạo mới một Repository, nó phân tích tất cả các method được define bới interface và cố gắng tự động tạo các truy vấn từ tên phương thức.
Mặc dù điều này có một số hạn chế, nhưng đó là một cách rất mạnh mẽ và thanh lịch để define các method truy cập tùy chỉnh mới với rất ít nỗ lực.
Hãy xem ví dụ dưới đây, nếu entity có field name, tôi sẽ define một method findByName trong interface FooDAO:
public interface IFooDAO extends JpaRepository<Foo, Long> {
Foo findByName(String name);
}
Code language: PHP (php)
Đây là một ví dụ tương đối đơn giản. Cơ chế tạo truy vấn hỗ trợ một bộ từ khóa lớn hơn nhiều. Trong trường hợp trình phân tích cú pháp không thể khớp thuộc tính với trường đối tượng miền. Chúng ta sẽ thấy ngoại lệ sau:
java.lang.IllegalArgumentException: No property nam found for type class
com.hdd.repository.Foo
Code language: CSS (css)
3.2. Manual Custom Queries
Bây giờ chúng ta hãy xem một Custom Query mà chúng ta sẽ define thông qua chú thích @Query:
@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);
Code language: JavaScript (javascript)
4. Transaction Configuration
Spring và Spring Data hỗ trợ việc quản lý transaction khiến cho việc này cực kỳ đơn giản, tất cả những gì chúng ta cần làm là chú thích một class hay một method với @Transactional annotation.
Transaction quản lý những thay đổi mà bạn thực hiện trong một hoặc nhiều hệ thống. Nó có thể database, message brokers, hoặc bất kỳ loại hệ thống phần mềm nào khác.
Mục tiêu chính của giao dịch là cung cấp các đặc điểm ACID để đảm bảo tính nhất quán và hợp lệ của dữ liệu của bạn.
5. Spring Data JPA Repository Configuration
Để kích hoạt hỗ trợ Spring JPA repository, chúng ta có thể sử dụng annotation @EnableJpaRepositories.
@EnableJpaRepositories(basePackages = "com.hdd.repository")
public class PersistenceConfig {
...
}
Code language: PHP (php)
Chúng ta có thể làm tương tự với cấu hình XML:
<jpa:repositories base-package="com.hdd.repository"/>
Code language: HTML, XML (xml)
6. Java hoặc XML Configuration
Chúng ta đã thảo luận rất chi tiết về cách cấu hình JPA trong Spring trong một bài viết trước. Spring Data cũng tận dụng sự hỗ trợ của Spring cho annotation JPA @PersistenceContext. Nó sử dụng điều này để chuyển EntityManager vào Spring factory bean. JpaRepositoryFactoryBean sẽ chịu trách nhiệm tạo các implement DAO.
Ngoài cấu hình đã được thảo luận, chúng ta cần include Spring Data XML Config nếu sử dụng XML:
@Configuration
@EnableTransactionManagement
@ImportResource("classpath*:*springDataConfig.xml")
public class PersistenceJPAConfig {
...
}
Code language: PHP (php)
7. Maven Dependency
Thêm cấu hình JPA, H2 database và vào pom.xml:
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency><dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
Code language: HTML, XML (xml)
application.properties:
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
8. Kết Luận
Trong bài viết này, tôi đã đề cập đến cấu hình và triển khai tầng persistence cùng với Spring5, JPA2 và Spring Data JPA sử dụng cả cấu hình XML và Java.
Chúng ta đã thảo luận về các cách để define các truy vấn tùy chỉnh nâng cao hơn, cũng như transaction semantics và cấu hình với jpa namespace.
Cuối cùng là source nhé 🤗 Github
Tham khảo thêm tại:
https://hocspringboot.net/2021/05/25/huong-dan-annotation-query-nativequery-trong-spring-data/
Leave a Reply