Sử dụng Jakarta Persistence (JPA) với Spring Framework

Trong Jakarta Persistence thì đối tượng EntityManagerFactory là một đối tượng factory chịu trách nhiệm quản lý các cấu hình liên quan đến persistence configuration và tạo ra các EntityManager instances. Việc sử dụng Spring để quản lý đối tượng này sẽ giúp chúng ta rất nhiều trong việc phát triển các ứng dụng Java có sử dụng Jakarta Persistence và Spring Framework. Trong bài viết này, mình sẽ hướng dẫn các bạn cách sử dụng Jakarta Persistence với Spring Framework, các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:

Spring framework dependency:

Để làm việc với Jakarta Persistence, chúng ta cũng cần thêm spring-orm dependency nữa:

Ở đây, mình sẽ sử dụng Jakarta Persistence với implementation của Hibernate nên mình sẽ thêm Hibernate dependency như sau:

MySQL Connector:

Để đơn giản, trong ví dụ này, mình chỉ định nghĩa một table chứa thông tin sinh viên với 2 cột như sau:

Để làm ví dụ thì mình đã thêm một số sample data như sau:

Entity của table Student có nội dung như sau:

Để làm việc với Jakarta Persistence, chúng ta cần có một tập tin cấu hình persistence.xml cho nó. Các bạn hãy tạo mới tập tin persistence.xml nằm trong thư mục /src/main/resources/META-INF, các bạn nhé!

Nội dung của tập tin này như sau:

Các bạn có thể xem thêm về tập tin persistence.xml ở đây.

Bây giờ sẽ là phần quan trọng nhất: khai báo đối tượng EntityManagerFactory trong Spring container.

Trong Spring, hiện tại chúng ta có hai class hỗ trợ cho việc khai báo đối tượng EntityManagerFactory đó là:

  • LocalContainerEntityManagerFactoryBean
  • LocalEntityManagerFactoryBean

Với class LocalEntityManagerFactoryBean thì tập tin cấu hình của Jakarta Persistence, persistence.xml, thường nằm trong thư mục /src/main/resources/META-INF. Với class LocalContainerEntityManagerFactoryBean thì location của tập tin persistence.xml sẽ linh hoạt hơn. Chúng ta có thể override lại location của nó và việc sử dụng LocalContainerEntityManagerFactoryBean sẽ giúp các bạn có thể khai báo JDBC DataSource linh hoạt hơn nữa.

Các bạn có thể xem thêm bảng so sánh giữa 2 class này như sau:

LocalEntityManagerFactoryBean LocalContainerEntityManagerFactoryBean
persistence.xml Required Supported
Spring DataSource No Yes
Spring transaction integration Limited Full
Advanced configuration Limited Yes
Typical use Simple standalone/test Spring applications

Mình sẽ tạo mới tập tin spring.xml ở thư mục /src/main/resources để cấu hình cho Spring.

Mình sẽ sử dụng LocalContainerEntityManagerFactoryBean trong ví dụ này với khai báo ban đầu cho nó trong Spring container như sau:

Với khai báo này thì Spring sẽ sử dụng tất cả các cấu hình được khai báo trong tập tin persistence.xml ở thư mục mặc định là /src/main/resources/META-INF, để khởi tạo đối tượng EntityManagerFactory trong Spring container đó các bạn.

Bây giờ thì các bạn có thể lấy bean của đối tượng EntityManagerFactory trong Spring container để chạy ứng dụng như sau:

Kết quả:

Sử dụng class LocalContainerEntityManagerFactory thì các bạn có thể khai báo tất cả các thông tin được định nghĩa trong tập tin persistence.xml như sau:

Như các bạn thấy, có 4 thuộc tính mà chúng ta có thể khai báo cùng với class LocalContainerEntityManagerFactory đó là:

  • packagesToScan: thuộc tính này định nghĩa tên của Java package chứa thông tin của các entity trong Jakarta Persistence đó các bạn.
  • dataSource: thuộc tính này dùng để khai báo DataSource cho EntityManagerFactory của chúng ta. DataSource ở đây, các bạn có thể hiểu nôm na là phần quản lý kết nối tới database. Chúng ta có thể khai báo nhiều loại DataSource khác nhau do nhiều tổ chức khác nhau implement interface javax.sql.DataSource.
  • persistenceUnitName: đây là tên của Persistence Unit mà chúng ta đã khai báo trong tập tin cấu hình của Jakarta Persistence, persistence.xml. Sử dụng Spring Framework thì các bạn cũng có thể không cần khai báo tên của Persistence Unit, các bạn nhé.
  • jpaVendorAdapter: thuộc tính này dùng để khai báo Persistence provider mà chúng ta sẽ sử dụng cho phần implementation của Jakarta Persistence. Trong ví dụ này, mình sử dụng Hibernate nên khai báo là HibernateJpaVendorAdapter. Nếu các bạn sử dụng EclipseLink làm implementation của Jakarta Persistence thì hãy khai báo thuộc tính này là org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter.

Phần dataSource trong ví dụ này mình sẽ sử dụng DriverManagerDataSource với các khai báo như chúng ta làm cho JDBC, như sau:

Nếu các bạn sử dụng Jakarta Persistence với Spring Framework thì phần khai báo các thuộc tính cho bean LocalContainerEntityManagerFactory sẽ có độ ưu tiên cao hơn so với trong tập tin persistence.xml, các bạn nhé.

Sau khi đã định nghĩa hết thông tin với class LocalContainerEntityManagerFactory thì các bạn cũng có thể remove tập tin persistence.xml luôn cũng được. Bây giờ thì tất cả các thông tin liên quan đến Jakarta Persistence đã được quản lý bởi Spring Framework rồi.

Chạy lại ví dụ thì các bạn cũng sẽ thấy kết quả như trên.

 

6 thoughts on “Sử dụng Jakarta Persistence (JPA) với Spring Framework”

  1. Bạn cho mình hỏi là khi khai báo :

    Nhưng khi dùng :
    EntityManagerFactory emf = (EntityManagerFactory) ac.getBean(“entityManagerFactory”);

    Mình xem thì ko thấy mối liên hệ nào giữa LocalContainerEntityManagerFactoryBean và EntityManagerFactory.

    làm sao để spring hiểu được như vậy? Thanks!

  2. anh xem giúp e lỗi này là gì ạ
    Error creating bean with name ‘studentDaoImpl’: Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’

Add Comment