Nói về tập tin persistence.xml trong JPA

Trong bài Cơ bản về JPA, mình đã giới thiệu các bạn về tập tin cấu hình để làm việc với JPA đó là persistence.xml. Trong bài viết này, mình sẽ làm rõ hơn về tập tin này nhé các bạn!

Như mình đã nói, tập tin persistence.xml sẽ chứa thông tin của một hoặc nhiều persistence unit. Mỗi persistence unit sẽ bao gồm thông tin về các entity mà chúng ta sẽ sử dụng, các thông tin về kết nối database, username, password và còn nhiều thông tin khác nữa. Để có một tập tin cấu hình hoàn chỉnh, chúng ta cần khai báo tên của persistence unit, transaction-type, class và properties.

Hãy xem lại tập tin persistence.xml mà chúng ta đã tạo trong bài viết Cơ bản về JPA các bạn nhé:

Các bạn thấy đó, mỗi persistence unit sẽ được khai báo trong một tag tên là <persistence-unit>. Nếu các bạn muốn thêm một persistence unit nữa thì chỉ cần thêm một tag <persistence-unit> mới và thêm nội dung vào đó mà thôi.

Thuộc tính name của <persistence-unit> tag khai báo tên gọi của persistence-unit và tên gọi này sẽ được sử dụng khi các bạn khởi tạo EntityManagerFactory. Ví dụ trong bài Cơ bản về JPA chúng ta đã tạo EntityManagerFactory bằng cách:

với jpaexample là tên gọi của persistence unit.

Cái thứ hai là thuộc tính transaction-type, cái này có tác dụng chỉ rõ persistence unit của chúng ta sẽ sử dụng resource transaction như thế nào? Có hai giá trị cho transaction-type đó là RESOURCE_LOCALJTA. Ý nghĩa của mỗi giá trị như sau:

  • RESOURCE_LOCAL:
    • Chúng ta sẽ quản lý việc tạo và sử dụng EntityManager.
    • Chúng ta phải sử dụng EntityManagerFactory để lấy EntityManager.
    • Chúng ta chỉ có thể sử dụng @PersistenceUnit annotation để lấy EntityManagerFactory.
    • Nếu các bạn gọi EntityManagerFactory.createEntityManager() bao nhiêu lần, nó sẽ tạo cho bạn bấy nhiêu EntityManager, điều này cần tránh nhé các bạn.
  • JTA:
    • Web container sẽ chịu trách nhiệm quản lý việc tạo và sử dụng EntityManager.
    • Các bạn không thể dùng EntityManagerFactory để lấy một EntityManager mà phải thông qua web container.
    • Chúng ta sẽ sử dụng @PersistenceContext để lấy một EntityManager.

Mặc định nếu chúng ta không khai báo transaction-type thì giá trị của nó sẽ là JTA cho môi trường web và sẽ là RESOURCE_LOCAL cho môi trường ứng dụng desktop.

Thông thường chúng ta nên sử dụng resource transaction là RESOURCE_LOCAL để dễ dàng hơn trong việc tạo và sử dụng EntityManager.

Cái thứ ba chúng ta cần đề cập là <class> tag, tag này dùng để khai báo các entity sẽ sử dụng trong ứng dụng của chúng ta. Nhiều entity đồng nghĩa với việc chúng ta phải khai báo nhiều <class> tag. Nếu trong bài viết trước mình sử dụng entity Students nữa thì mình sẽ khai báo <class> tag như sau:

Khai báo <exclude-unlisted-classes>true</exclude-unlisted-classes> mang ý nghĩa chỉ những class được khai báo trong tập tin cấu hình này mới được sử dụng như những entity để thao tác với database.

Phần cuối cùng chúng ta cần đề cập là các properties. Như các bạn thấy, một số properties được dùng để định nghĩa thông tin kết nối database của ứng dụng chúng ta.

  • javax.persistence.jdbc.driver
  • javax.persistence.jdbc.url
  • javax.persistence.jdbc.user
  • javax.persistence.jdbc.password

Ngoài ra chúng ta cần biết một số properties khác nữa, như trong ví dụ của chúng ta là:

  • javax.persistence.schema-generation.database.action: properties này dùng để chỉ định JPA sẽ làm gì với database khi ứng dụng của chúng ta được triển khai. Nếu chúng ta không khai báo thì sẽ không có bất kỳ thao tác nào xảy ra với database của chúng ta cả. Giá trị của nó như sau:
    • none: giá trị này có ý nghĩa giống như khi chúng ta không khai báo thuộc tính này. Không có gì xảy ra hết.
    • create: JPA sẽ tạo mới database khi ứng dụng của chúng ta được triển khai.
    • drop-and-create: JPA sẽ xóa database cũ và tạo lại database mới khi ứng dụng của chúng ta được triển khai.
    • drop: database của chúng ta sẽ bị delete khi ứng dụng của chúng ta được triển khai.
  • hibernate.format_sql: properties được dùng trong trường hợp các bạn cần hiển thị câu lệnh SQL của Hibernate ra console và chúng phải được định dạng để chúng ta có thể dễ dàng đọc được.
  • hibernate.use_sql_comments: properties này được dùng với Hibernate trong trường hợp các bạn muốn biết câu lệnh SQL đang muốn làm gì.

Một số properties mình sẽ nói rõ hơn kèm theo ví dụ để các bạn có thể hiểu rõ hơn trong những bài viết sau nhé.

Add Comment