JPA và Spring framework

Trong JPA thì đối tượng EntityManagerFactory sẽ là đối tượng quản lý các entity, quản lý kết nối đến database. 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 JPA. Trong bài viết này, mình sẽ hướng dẫn các bạn cách sử dụng JPA 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ụ:

JPA và Spring framework

Spring framework dependency:

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

Ở đây, mình sẽ sử dụng JPA 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 JPA, 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:

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 JPA persistence.xml thường nằm trong thư mục META-INF/persistence.xml, tuy nhiên 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 JPA, 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 JPA. 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 JPA 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 “JPA và 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