Sử dụng Hibernate trong Spring Boot

Hibernate đến thời điểm tại có thể xem là một ORM có tầm ảnh hưởng lớn trong cộng đồng Java. Đóng vai trò là một ORM framework đi đầu trong lĩnh vực, đa số các dự án đều tin cậy và sử dụng Hibernate. 

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách sử dụng Hibernate trong Spring Boot. Có thể các bạn sẽ ngỡ ngàng rằng bản thân dependency spring-boot-starter-data-jpa đã bao gồm Hibernate trong đó, nhưng nếu các bạn không để ý thì chúng ta cùng tìm hiểu qua bài viết này nhé.

Maven Dependency

Nếu chúng ta mở pom.xml, chúng ta sẽ thấy rằng chúng ta có spring-boot-starter-webspring-boot-starter-test là các dependency để chúng ta có thể sử dụng Spring Boot.

Để sử dụng JPA trong Spring Boot chúng ta cần thêm spring-boot-starter-data-jpa để sử dụng.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Dependency này đã bao gồm JPA API, JPA implementaton, JDBC và các thư viện cần thiết khác. Spring chọn Hibernate JPA implementation là trình triển khai mặc định của JPA API, vì vậy trong spring-boot-starter-data-jpa đã bao gồm Hibernate JPA implementation.

Cuối cùng chúng ta sẽ sử dụng H2 dependency để thực hành các ví dụ trong bài viết này.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Khởi tạo Entity

Entity là một ánh xạ tương ứng với một table trong database, do vậy việc đầu tiên chúng ta cần làm là định nghĩa các entity tương ứng với các table đã được thiết kế từ trước.

package com.deft.hibernateintegration.entities;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Table(name = "book")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

Tạo Repository và Service

Tiếp theo, Repository là một trong những component cơ bản tương ứng với một entity được dùng để thao tác với database. 

package com.deft.hibernateintegration.repositories;

import com.deft.hibernateintegration.entities.Book;
import org.springframework.stereotype.Repository;

@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
}

Chúng ta có thể sử dụng JpaRepository interface từ Spring framework để cung cấp triển khai mặc định cho các hoạt động CRUD cơ bản như insert, delete, update.

Tiếp theo, hãy thêm BookService interface vào services package đại diện cho các function có thể có trong BookService.

package com.deft.hibernateintegration.services;

import com.deft.hibernateintegration.entities.Book;

import java.util.List;

public interface BookService {

    List<Book> findAll();
}

Và một triển khai của BookService.

package com.deft.hibernateintegration.services.impl;

import com.deft.hibernateintegration.entities.Book;
import com.deft.hibernateintegration.repositories.BookRepository;
import com.deft.hibernateintegration.services.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookRepository;

    @Override
    public List<Book> findAll() {
        return bookRepository.findAll();
    }
}

Như vậy là chúng ta đã hoàn thành các bước cơ bản để tạo và thao tác dữ liệu với Hibernate. Bây giờ, mình sẽ kiểm thử bằng unit-test để xem nó có hoạt động hay không. Lưu ý, H2 chỉ là memory database, nên không cần cấu hình datasoure/

package com.deft.hibernateintegration;

import com.deft.hibernateintegration.entities.Book;
import com.deft.hibernateintegration.repositories.BookRepository;
import com.deft.hibernateintegration.services.BookService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class HibernateIntegrationApplicationTests {

    @Autowired
    private BookService bookService;

    @Autowired
    private BookRepository bookRepository;

    @BeforeAll
    void setup() {
        Book book1 = new Book();
        Book book2 = new Book();
        Book book3 = new Book();
        bookRepository.saveAll(Lists.newArrayList(book1, book2, book3));
    }

    @Test
    void loadTest() {
        List<Book> books = bookService.findAll();

        assertEquals(3, books.size());
    }
}

JPA – Hibernate kết nối đến database

Nếu muốn kết nối đến database thật, chúng ta cần cấu hình DataSource là các thông tin kết nối đến db như url, username, password. Ngoài ra còn một số cấu hình của JPA như tự động tạo bảng, hiển thị query, etc.

Dưới đây là một application.properties cấu hình cơ bản để kết nối đến MariaDB

Trước tiên, chúng ta cần thêm Mariab denpendency vào file pom. Nếu sử dụng MySQL thì các bạn sẽ phải sử dụng dependency tương ứng hỗ trợ cho MySQL.

<dependency>
	<groupId>org.mariadb.jdbc</groupId>
	<artifactId>mariadb-java-client</artifactId>
	<version>2.7.1</version>
</dependency>

Sau đó, tiến hành các bước cấu hình đơn giản. Spring Boot sẽ tự động đọc cấu hình và tạo các kết nối đến database dựa theo những thông tin mà bạn cung cấp.

# ===============================
# = DATA SOURCE
# ===============================
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/store?useSSL=false
spring.datasource.username=root
spring.datasource.password=admin

# ===============================
# = SPRING JPA
# ===============================
spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql=true
spring.jpa.generate-ddl=false
spring.jpa.properties.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.format_sql=true

Để kiểm thử mình sẽ tạo một controller để lấy dữ liệu từ database thông qua tầng service.

package com.deft.hibernateintegration.controllers;

import com.deft.hibernateintegration.entities.Book;
import com.deft.hibernateintegration.services.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping
    public List<Book> findAll() {
        return bookService.findAll();
    }
}

Thực hiện truy vấn đến http://localhost:8080/book

curl http://localhost:8080/book
----
[
    {
        "id": 1,
        "name": null
    },
    {
        "id": 2,
        "name": null
    },
    {
        "id": 3,
        "name": null
    }
]

Kết bài

Như vậy chúng ta đã biết được những bước cơ bản nhất để tạo một ứng dụng thao tác với database sử dụng JPA, và Hibernate Implementation trong dự án Spring Boot. Hiện nay, Hibernate là một ORM được sử dụng rất rộng rãi trong các dự án Spring, có nhiều bạn đang hằng ngày làm việc với nó cũng có khi lơ là mà không biết bên dưới JPA là Hibernate.

Mã nguồn được mình công khai trên gitlab để các bạn có thể tiện tham khảo: spring-boot-hibernate

Nguồn tham khảo

https://www.baeldung.com/spring-boot-hibernate

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x