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. 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:

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 Datasources linh hoạt hơn nữa.

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

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

  • dataSource: thuộc tính này dùng để khai báo DataSource cho EntityManagerFactory của chúng ta. DataSource ở đây, chúng ta 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.
  • jpaVendorAdapter: thuộc tính này dùng để khai báo thư viện 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:

OK, vậy là chúng ta đã hoàn thành việc khai báo EntityManagerFactory trong Spring container. Giờ thì sử dụng nó thôi!

Ví dụ của mình như sau:

Hiện tại database của mình đang có dữ liệu như sau:

JPA và Spring framework

nên kết quả sẽ là:

JPA và Spring framework

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