Mục lục
Trước khi có Spring Boot, chúng ta phải làm rất nhiều thứ để có thể sử dụng Spring Data JPA. Chúng ta phải chú thích các entity class với các mapping annotation, thêm Spring Data JPA dependency, cấu hình database connection. Ngoài ra chúng ta cần phải kích hoạt các repository, transaction management và cả cấu hình EntityManagerFactory. Đấy là những công việc nhàm chán, lặp đi lặp lại.
Spring Boot đã thay đổi điều đó bằng cách tích hợp sẵn các dependency cần thiết và một tập hợp các cấu hình mặc định cần thiết để sử dụng Spring Data JPA. Sau đó chúng ta có thể thay đổi những cấu hình mặc định này tuỳ thuộc vào các yêu cầu cụ thể.
Trong bài viết này, chúng ta sẽ tìm hiểu các cấu hình mặc định mà Spring Boot đã thiết lập cho Spring Data JPA. Cách để thay đổi các cấu hình mặc định cũng nhưu thêm một số cấu hình cần thiết.
Dependency
Trước khi bắt đầu cấu hình Spring Data JPA, chúng ta cần thêm nó vào ứng dụng. Trong Spring boot, chúng ta có thể Spring Data JPA dependency vào maven như sau
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
Ngoài ra chúng ta cũng cùng thêm JDBC driver cho từng database cụ thể mà ứng dụng sử dụng. Trong ví dụ này, sẽ hướng dẫn các bạn kết nối đến PostgreSQL database, vì vậy chúng ta cần thêm PostgreSQL JDBC driver.
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>${postgresql.version}</version> </dependency>
Cấu hình mặc định
Như đã đề cập trước đó, Spring Boot tích hợp Spring Data JPA đã cung cấp hầu hết các cấu hình mặc định và các dependency cần thiết để sử dụng Spring Data JPA. Bao gồm:
- HikariCP dependency và các cấu hình mặc định của nó. Chúng ta có thể đặt các cấu hình mới hoặc ghi đề các cấu hình mặc định của HikariCP trong application.properties với tiền tố spring.datasource.hikari.
- Tạo h2 database in-memory nếu có sử dụng JDBC H2 driver trong classpath.
- Một Hibernate dependency dùng làm JPA implementation mặc định và các cấu hình bắt buộc để khởi tạo EntityManagerFactory.
- Dependency và các cấu hình bắt buộc để quản lý các transaction. Trong đó sử dụng Atomikos.
- Các cấu hình bắt buộc để sử dụng Spring Data JPA repository.
Như các bạn có thể thấy trên đây là tất cả những thư cơ bản chúng ta cần để cấu hình Spring Data. Đó là lý do tại sao các dự án hiện nay thích sử dụng Spring Boot hơn Spring truyền thống.
Nếu đang sử dụng cơ sở dữ liệu memory, bạn không cần phải cấu hình thêm bất cứ thứ gì. Các cấu hình mặc định của Spring Boot thường đủ cho tất cả các ứng dụng từ nhỏ đến trung bình.
Hầu hết các ứng dụng trong của doanh nghiệp sử dụng các cơ sở dữ liệu độc lập như PostgreSQL, Oracle data hay MySQL thì chỉ cần cung cấp URL, username và password để kết nối đến database.
spring.datasource.url=jdbc:postgresql://localhost:5432/test spring.datasource.username=postgres spring.datasource.password=postgres
Tuỳ biến các cấu hình mặc định
Chúng ta hoàn toàn có thể tuỳ biến các cấu hình mặc định của Spring Boot cung cấp sẵn khi kết hợp với Spring data. Chẳng hạn như
Thay đổi connection Pool
Mặc định Spring Boot sẽ thêm HikariCP và tự động cung cấp các cấu hình cần thiết cho nó. Chúng ta có thể sử dụng các connection pooling khác bằng cách loại bỏ HikariCP khỏi project.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency>
Spring boot sẽ cố gắng tìm một triển khai của connecion pooling trên classpath khác để thay thế theo thứ tự:
- Tomcat Connection Pooling,
- Commons DBCP2,
- Oracle UCP.
Nếu không muốn sử dụng cơ chế quét này, chúng ta có thể chỉ định rõ trong file cấu hình thông qua thuộc tính spring.datasource.type.
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
Sau khi thay đổi connection pooling, chúng ta có thể đặt các cấu hình tương ứng với connection pooling được chọn như spring.datasource.tomcat tương ứng với Tomcat, hay spring.datasource.dbcp2 tương ứng với Commons DBCP2, và spring.datasource.oracleucp là Oracle UCP.
Bitronix Transaction Manager
Trong quá khứ, Bitronix là một trong những trình quản lý transaction phổ biến nhất trong các ứng dụng Spring. Tuy nhiên Spring boot gần đây đã không còn hỗ trợ và Bitronix sẽ bị xoá sớm trong tương lai.
Nếu bạn vẫn muốn sử dụng nó, bạn có thể thêm spring-boot-starter-jta-bitronix vào ứng dụng. Spring boot sẽ tự động thêm các dependency và cấu hình mặc định tương ứng cho Bitronix.
Vô hiệu hoá Spring Data JPA repository
Mình khuyên các bạn nên sử dụng Spring Data JPA repository vì nó giúp chúng ta triển các chức năng persistence hiệu quả hơn thông qua các method persist, read và delete các entity.
Nhưng nếu bạn vẫn không muốn sử dụng nó, bạn có thể vô hiệu hoá với cấu hình sau:
spring.data.jpa.repositories.enabled=false
Hibernate Logging
Trong quá trình phát triển ứng dụng, chúng ta cần nhiều thông tin hơn về các hoạt động với database. Nhầm giúp chúng ta nhận ra các phát đề phát sinh và nhanh chóng tìm ra cách sửa lỗi.
Để lấy nhiều thông tin nhất có thể, các bạn nên sử dụng cấu hình sau
logging.level.org.hibernate=INFO logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.cache=DEBUG logging.level.org.hibernate.stat=DEBUG
Các cấu hình trên sẽ cung cấp các mô tả về só lượng và thời gian mà Hibernate thực thi các hoạt động quan trọng trong mối session. Ngoài ra nó cũng thêm tất cả các câu lệnh SQL mà nó thực thi vào file log và cho chúng ta thấy bộ nhớ catce 2nd được sử dụng như thế nào.
Tuy nhiên, trên môi trường production chúng ta nên đặt log level là ERROR để xem những lỗi nghiêm trọng và giảm chi phí lưu trữ log.
logging.level.org.hibernate=ERROR
Cấu hình JPA và Hibernate
Khi chúng ta sử dụng JPA và hibernate mà không có Spring Data, chúng ta cần cấu hình persistence.xml file với các cấu hình bắt buộc.
Trong Spring boot chúng ta cũng có thể cấu hình các thuộc tính năng thông qua các thuộc tính có tiền tố spring.jpa.properties.
spring.jpa.properties.hibernate.generate_statistics=true
Database Creation
Mặc định, Spring boot sẽ tự động tạo database in-memory cho bạn, nhưng đối với các database khác như MySQL, Oracle v.v thì bị huỷ kích hoạt. Chúng ta có thể kích hoạt tính năng này thông qua thuộc tính spring.jpa.hibernate.ddl-auto với các giá trị none, validate, update, hoặc create-drop.
spring.jpa.hibernate.ddl-auto=create-drop
Tóm lược
Spring boot đã cung cấp hầu hết các điều cần thiết để ứng dụng chúng ta có thể sử dụng Spring Data JPA. Điều duy nhất chúng ta cần làm đó là cấu hình các thông tin kết nối đến database.
Mặc dù các cấu hình mặc định này thông thường là tốt cho hầu hết các trường hợp, chúng ta vẫn có thể ghi đè chúng thông qua các cách mà bài viết nêu trên.
Nguồn
https://thorben-janssen.com/configuring-spring-data-jpa-with-spring-boot/