Vòng đời của Entity trong Hibernate
Entity trong Hibernate có thể trải qua các trạng thái khác nhau trong vòng đời của nó. Các trạng thái chính bao gồm:
Transient (Tạm thời)
Persistent (Bền vững)
Detached (Tách rời)
Removed (Xóa)
1. Transient (Tạm thời)
Mô tả:
Entity ở trạng thái Transient khi nó vừa mới được khởi tạo bằng từ khóa
new
và chưa được liên kết với bất kỳ session nào của Hibernate.Các entity ở trạng thái này không liên kết với cơ sở dữ liệu và không có bất kỳ sự quản lý nào từ Hibernate.
Ví dụ:
User user = new User();
user.setUsername("johndoe");
user.setPassword("password123");
// user hiện tại đang ở trạng thái Transient
2. Persistent (Bền vững)
Mô tả:
Entity chuyển sang trạng thái Persistent khi nó được lưu (persist) hoặc được tải (load) thông qua session của Hibernate.
Hibernate quản lý entity này và mọi thay đổi sẽ tự động được đồng bộ với cơ sở dữ liệu khi session được flush.
Ví dụ:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setUsername("johndoe");
user.setPassword("password123");
session.save(user); // user chuyển sang trạng thái Persistent
transaction.commit();
session.close();
3. Detached (Tách rời)
Mô tả:
Entity chuyển sang trạng thái Detached khi session quản lý nó bị đóng hoặc clear.
Entity ở trạng thái này không còn được Hibernate quản lý, nhưng vẫn đại diện cho một bản ghi trong cơ sở dữ liệu.
Ví dụ:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1L); // user ở trạng thái Persistent
transaction.commit();
session.close(); // user chuyển sang trạng thái Detached
Tái gắn kết (Re-attaching) entity Detached:
Session session2 = HibernateUtil.getSessionFactory().openSession();
Transaction transaction2 = session2.beginTransaction();
session2.update(user); // user chuyển trở lại trạng thái Persistent
transaction2.commit();
session2.close();
4. Removed (Xóa)
Mô tả:
Entity chuyển sang trạng thái Removed khi nó được đánh dấu để xóa khỏi cơ sở dữ liệu thông qua phương thức
delete
của session.Khi transaction được commit, bản ghi tương ứng trong cơ sở dữ liệu sẽ bị xóa.
Ví dụ:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1L);
session.delete(user); // user chuyển sang trạng thái Removed
transaction.commit(); // Bản ghi của user bị xóa khỏi cơ sở dữ liệu
session.close();
EntityManager trong Hibernate (JPA)
EntityManager là gì? EntityManager là một API chuẩn của JPA (Java Persistence API) được sử dụng để quản lý các entity. Nó cung cấp các phương thức để thực hiện các thao tác CRUD (Create, Read, Update, Delete) và quản lý vòng đời của các entity.
Các phương thức chính của EntityManager
persist(Object entity)
Chuyển entity từ trạng thái Transient sang Persistent.
Entity sẽ được Hibernate quản lý và đồng bộ với cơ sở dữ liệu.
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
User user = new User();
user.setUsername("johndoe");
user.setPassword("password123");
em.persist(user); // user chuyển sang trạng thái Persistent
em.getTransaction().commit();
em.close();
find(Class entityClass, Object primaryKey)
Tìm kiếm entity theo khóa chính.
Nếu tìm thấy, entity sẽ ở trạng thái Persistent.
User user = em.find(User.class, 1L); // user chuyển sang trạng thái Persistent
merge(Object entity)
Chuyển entity từ trạng thái Detached sang Persistent.
Tạo một bản copy của entity và quản lý nó.
em.getTransaction().begin();
User user = new User();
user.setId(1L);
user.setUsername("newname");
user = em.merge(user); // user chuyển sang trạng thái Persistent
em.getTransaction().commit();
remove(Object entity)
Đánh dấu entity để xóa khỏi cơ sở dữ liệu.
Entity chuyển sang trạng thái Removed.
User user = em.find(User.class, 1L);
em.remove(user); // user chuyển sang trạng thái Removed
detach(Object entity)
Chuyển entity từ trạng thái Persistent sang Detached.
Entity sẽ không còn được Hibernate quản lý.
em.detach(user); // user chuyển sang trạng thái Detached
clear()
- Xóa bỏ tất cả các entity đang được quản lý bởi EntityManager, chuyển chúng sang trạng thái Detached.
em.clear(); // Tất cả các entity chuyển sang trạng thái Detached
flush()
- Đồng bộ hóa trạng thái của tất cả các entity quản lý với cơ sở dữ liệu.
em.flush(); // Đồng bộ hóa với cơ sở dữ liệu
Kết luận
Hiểu về vòng đời của entity và cách sử dụng EntityManager là rất quan trọng để quản lý các entity hiệu quả trong Hibernate. Các trạng thái Transient, Persistent, Detached, và Removed phản ánh sự thay đổi của entity từ khi khởi tạo cho đến khi bị xóa hoặc tách rời khỏi sự quản lý của Hibernate. EntityManager cung cấp các phương thức cần thiết để quản lý các trạng thái này và thực hiện các thao tác CRUD một cách hiệu quả.