Quá trình chuyển đổi trạng thái của entity trong JPA và Hibernate

Hibernate giúp các lập trình viên giảm bớt các câu lệnh SQL thay vào đó họ chỉ cần quan tâm đến quá trình chuyển đổi trạng thái của thực thể (tương ứng với một dòng dữ liệu dưới database – entity) trong Java. Khi một entity được Hibernate quản lý, tất cả các thay đổi trên đó sẽ tự động cập nhật xuống database thông qua Hibernate.

Chúng ta thấy rằng, thao tác trên các entity – Java object dễ hơn rất nhiều so với việc chúng ta phải viết và bảo trì các câu lệnh SQL. Ví dụ khi xoá một dòng dữ liệu bằng SQL thì chúng ta phải viết thêm các câu lệnh SQL để xoá các entity đang tham chiếu đến dòng bị xoá. Hibernate thực thi cơ chế này một cách tự động khi một entity bị xoá thông qua một số cấu hình được hibernate cung cấp.

Các trạng thái của entity

hibernateentitystates

Ở phần trước chúng ta đã biết rằng khi một entity được Hibernate quản lý, các thay đổi trên đó sẽ được Hibernate đồng bộ xuống database. Tuy nhiên trong Hibernate và JPA một entity sẽ có trạng thái khác nhau và chỉ khi ở trạng thái Persistent thì chúng mới lắng nghe những thay đổi và đồng bộ xuống database.

Transient

Một entity vừa được khởi tạo sẽ ở trạng thái Transient (transient entity) và không tương ứng với bất kỳ một dòng dữ liệu nào trong database. Để chuyển qua trạng thái Persistent chúng ta cần gọi EntityManager#persist method hoặc sử dụng các cơ chế transitive persistence.

Persistent

Một entity ở trạng thái Persistence(persistence entity) tương ứng với một dòng dữ liệu trong database và được quản lý bởi Persistence Context đang chạy. Bất kỳ thay đổi nào trên entity đều được Hibernate ghi lại và đồng bộ xuống database tại thời điểm Session flush-time.

Persistence Context – Trong Java Persistence, một EntityManager chứa  một Persistence context, khi chúng ta khởi tạo một EntityManager EntityManagerFactory#createEntityManager() thì một persistence context sẽ được khởi tạo cùng và bị đóng khi gọi EntityManager#close(). Một persistence context quản lý tất cả các persistence entity và cho phép persistence engine kiểm tra và ghi nhận các thay đổi trên chúng.

Session flush-time là thời điểm mà JPA-Hibernate đồng bộ hoá các thay đổi của các entity xuống database. JPA và Hibernate hỗ trợ một số chiến lược để xác định flush-time. Ví dụ trong Hibernate và JPA sử dụng mặc định flush-before-query, bởi hầu hết các câu truy vấn đều phải kết nối đến database, đây cũng là thời điểm tốt để thực thi các thay đổi trên entity xuống database.

Detached

Khi Persistence Context bị đóng lại, tất cả các entity được quản lý trước đó sẽ chuyển sang trạng thái Detached(detached entity). Các thay đổi kế tiếp trên các entity này sẽ không được Hibernate ghi nhận và đồng bộ xuống database.

Để liên kết các detached entity với Hibernate Session chúng ta có những cách sau:

  • Reattaching
    • Hibernate hỗ trợ Reattaching thông qua Session#update method.
    • Lưu ý rằng Session chỉ có thể liên kết với một entity được định danh duy nhất theo khoá chính tại một thời điểm. Nếu chúng ta Reattaching một entity chứa khoá chính đã tồn tại trong Session thì một exception sẽ được ném ra. 
  • Merging
    • Các chức năng merge trong hibernate, jpa sẽ sao chép trạng thái của detached entity vào Session được hibernate quản lý. Nếu trong Session hiện tại có một entity tương ứng(Object có cùng khoá chính với detached entity) thì giá trị của chúng sẽ được hợp nhất, nếu không thì Session sẽ xuống database lấy lên một entity tương ứng và giá trị của chúng cũng sẽ được hợp nhất với nhau.

Removed

Một removed entity sẽ bị xoá khởi database thông qua Session#delete method. Các removed entity này sẽ được xếp vào hàng đợi và sẽ được xoá khỏi database tại flush-time.

Tóm lược

Như vậy chúng ta đã thấy được Hibernate hỗ trợ cho chúng ta tốt như thế nào, thử nghĩ trong quá trình thao tác với entity mỗi lần thay đổi gì đó trên một dòng dữ liệu là chúng ta phải viết một câu SQL thì thật là đau khổ, chưa kể đến hiệu năng bị ảnh hưởng nghiêm trọng khi một số lượng lớn câu truy vấn được đẩy xuống database. Hibernate ngoài cung cấp đầy đủ tính năng cho phép đồng bộ những thay đổi trên entity xuống database nó còn tối ưu hoá hiệu xuất bằng cách gom nhóm và thực hiện các câu truy vấn tại thời điểm flush-time.

Nguồn tham khảo

https://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_overview_emfactory_perscontext.html

https://vladmihalcea.com/a-beginners-guide-to-jpa-hibernate-entity-state-transitions/

https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/objectstate-detached.html

A beginner’s guide to flush strategies in JPA and 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