Bài 11: Phân biệt openSession() và getCurrentSession() trong Hibernate

Để phân biệt openSession()getCurrentSession() trong Hibernate, hôm nay mình sẽ chỉ ra trường hợp nào sử dụng phương thức openSession() và  getCurrentSession().

Trong trường hợp đa luồng chúng ta sử dụng phương thức openSession() và ngược lại sử dụng phương thức getCurrentSession(). Để hiểu rõ hơn về hai phương thức trên mời các bạn đến  với cách sử dụng phương thức openSession()getCurrentSession().

1. Cách sử dụng phương thức getCurrentSession() trong Hibernate.

Khi sử dụng phương thức getCurrentSession() Hibernate sẽ tự động đẩy dữ liệu đi (session.flush()) và đóng session lại (session.close()). Trong trường hợp chỉ sử dụng session một lần thì ta sử dụng phương thức getCurrentSession(), sau đây là ví dụ sử dụng phương thức getCurrentSession() trong Hibernate.

1.1. ví dụ sử dụng phương thức getCurrentSession() trong Hibernate.   

Trong ví dụ này mình có một đối tượng User, mình sẽ thực hiện thêm đối tượng User xuống cơ sở dữ liệu. Dưới đây là cấu trúc project của ví dụ trên.

kenhlaptrinh.net_phan-biet-opensession-va-getcurrentsession-trong-hibernate

Package util chứa  file hibernate.cfg và class HibernateUtil.java:

Để sử dụng phương thức getCurrentSession() ta cần cấu hình trong file hibernate.cfg như sau:

Khi sử dụng phương thức getCurrentSession() sẽ đưa ra một ngoại lệ nên cần cấu hình “hibernate.current_session_context_class” trong file hibernate.cfg. Nếu không cấu hình khi chạy chương trình sẽ hiển thị lỗi như sau:

Class HibernateUtil.java

Package model chứa class User.java:

Class User.java

Package test chứa class TestApp.java

Class TestApp.java

Kết quả khi chạy chương trình

Kết quả cho thấy khi sử dụng phương thức getCurrentSession() thì session sẽ tự động đẩy dữ liệu (flush()) và đóng (close()) session. Bây giờ chúng ta sẽ tìm hiểu cách sử dụng phương thức openSession().

2. Cách sử dụng phương thức openSession() trong Hibernate.

Đối với phương thức openSession() thì khi thực hiện xong một hành động nào đó (thêm, xóa, sửa) thì session vẫn còn giữ và không tự động đẩy (flush()) dữ liệu đi mà bạn phải tự làm việc này.

Với cấu trúc project như trên mình chỉ thêm phương thức addUser_openSession() trong Class TestApp.java

Kết quả khi chạy chương trình

Như các bạn thấy khi thực hiện xong phương thức save() thì session vẫn còn mở. Bây giờ là phần lấy danh sách User bởi hai phương thức getCurrentSession()openSession() các bạn sẽ thấy rõ sự khác nhau khi sử dụng hai phương thức này.

3. Sự khác nhau giữa hai phương thức getCurrentSession() và openSession() trong Hibernate.

Với phương thức addUser_getCurrentSession() trong Class TestApp.java mình sẽ thêm một đoan code là lấy danh sách User sau khi save() đối tượng User xuống cơ sở dữ liệu.

Vây  đây là kết  quả khi chạy đoạn code trên

Kết quả xuất hiện lỗi do session đã bị đóng nên không thể thực hiện câu truy vấn lấy danh sách User từ cơ sở dữ liệu.

Tiếp theo là phương thức addUser_openSession()

Kết quả khi chạy phương thức addUser_openSession()

Do session còn mở nên có thể thực hiện câu truy vấn tới cơ sở dữ liệu. Bây giờ thì  các bạn có thể hiểu rõ sự khác nhau giữa hai phương thức getCurrentSession() và openSession().

Download source code Phân biệt openSession() và getCurrentSession() trong Hibernate bên dưới.

Download link Google Drive

Download link Vipshare

Download link Mshare

(Tác giả: Công Minh)

4 thoughts on “Bài 11: Phân biệt openSession() và getCurrentSession() trong Hibernate

  1. Ví dụ mình danh sách số từ 1->1000 vào database.

    Mình dùng vòng for từ 1->1000 và khúc nội dung là câu lệnh lưu dữ liệu.

    Trong trường hợp này mình nên dùng session nào? Mong bạn giúp mình nhé

    1. Các hướng dẫn trên mạng mình đọc thì có cấu trúc dạng

      try {
      beginTransaction();
      sf.openSession().save(data);
      getTransaction().commit();
      } catch (Exception e) {
      getTransaction().rollback();
      }
      Mình muốn với opensession có cần gọi rollback hay không

    2. bạn có thể sử dụng openSession() hay getCurrentSession() đều được nha.
      Nếu bạn sử dụng openSession() thì sau dòng transaction.commit();
      bạn phai đóng session lại session.close();
      getCurrentSession() thì sau khi transaction.commit(); là nó đã tự động close session cho bạn.

Bình luận

Loading...