Site icon Blog Dương Trạng

Hibernate là gì? Sao phải dùng nó thay JDBC?

Bài viết được đăng với sự cho phép của tác giả Lê Chí Dũng

Nếu bạn đã biết về JDBC, thì JDBC là một công cụ kết nối cơ sở dữ liệu còn rất cơ bản và đã được sử dụng từ lâu với nhiều vấn đề. Hibernate được ra đời nhằm giải quyết những vấn đề này và cải thiện hiệu suất.

Hibernate là gì?

Hibernate là một thư viện mã nguồn mở ORM (Object Relational Mapping) giúp lập trình viên viết ứng dụng Java có thể ánh xạ các đối tượng (POJO) với cơ sở dữ liệu quan hệ, và hỗ trợ thực hiện các khái niệm lập trình hướng đối tượng với cơ sở dữ liệu quan hệ. Quy trình làm việc với Hibernate:

Persistence object (Đối tượng lưu trữ) Chính là các đối tượng POJO mà ánh xạ với các bảng tương ứng trong cơ sở dữ liệu quan hệ. Chúng có chức năng như các “thùng chứa” để lưu trữ dữ liệu từ ứng dụng xuống cơ sở dữ liệu, hoặc để lưu trữ dữ liệu từ cơ sở dữ liệu lên ứng dụng.

Session Factory (Xưởng công tác) Là một interface giúp tạo ra các phiên session để kết nối với cơ sở dữ liệu bằng cách đọc các cấu hình trong file cấu hình Hibernate. Mỗi cơ sở dữ liệu phải có một session factory tương ứng.

Ví dụ, nếu chúng ta sử dụng MySQL và Oracle cho ứng dụng Java của mình, chúng ta cần có một session factory cho MySQL và một session factory cho Oracle.

Session Hibernate (Phiên làm việc với Hibernate) Mỗi đối tượng session được tạo ra bởi session factory sẽ thiết lập một kết nối với cơ sở dữ liệu.

Transation (Giao dịch) Đảm bảo tính toàn vẹn của phiên làm việc với cơ sở dữ liệu. Điều này có nghĩa là nếu có một lỗi xảy ra trong quá trình giao dịch, tất cả các hoạt động cũng sẽ thất bại.

Truy vấn (Query) Hibernate cung cấp các truy vấn HQL (Hibernate Query Language) để gửi tới cơ sở dữ liệu và ánh xạ kết quả trả về với các đối tượng tương ứng trong ứng dụng Java.

Nếu bạn muốn làm việc với Hibernate, hãy tham khảo hướng dẫn sử dụng Hibernate cho người mới bắt đầu tại lcdung.top

Tại sao nên sử dụng Hibernate thay vì JDBC?

1. Ánh xạ đối tượng:

Với JDBC, chúng ta phải ánh xạ thủ công các trường trong bảng với thuộc tính của đối tượng Java. Với Hibernate, chúng ta có thể ánh xạ một cách tự động thông qua file cấu hình XML hoặc sử dụng các annotation. Hibernate sẽ ánh xạ đối tượng Java với bảng như sau:

Ví dụ, với bảng “user” và sử dụng các annotation, Hibernate sẽ ánh xạ đối tượng Java một cách tự động như sau:

2. HQL:

Hibernate cung cấp câu lệnh truy vấn tương tự như SQL, nhưng HQL của Hibernate hỗ trợ đầy đủ các khái niệm đa hình, kế thừa, và quan hệ giữa các đối tượng.

3. Độc lập với cơ sở dữ liệu:

Mã code sử dụng Hibernate độc lập với hệ quản trị cơ sở dữ liệu, điều này có nghĩa là chúng ta không cần thay đổi câu lệnh HQL khi chuyển từ MySQL sang Oracle hoặc các hệ quản trị cơ sở dữ liệu khác. Điều đó giúp rất dễ dàng thay đổi cơ sở dữ liệu, chỉ cần thay đổi thông tin cấu hình trong file cấu hình.

Ví dụ, nếu chúng ta muốn lấy 10 bản ghi từ hai cơ sở dữ liệu khác nhau:

Với JDBC, chúng ta có các câu truy vấn như sau:

Với Hibernate, câu truy vấn không thay đổi với cả hai cơ sở dữ liệu:

4. Giảm thiểu việc thay đổi code:

Khi thay đổi hoặc thêm cột vào bảng, với JDBC chúng ta phải thay đổi:

5. Lazy Loading:

Đối với các ứng dụng Java làm việc với cơ sở dữ liệu lớn có hàng triệu bản ghi, việc sử dụng Lazy loading trong việc truy cập dữ liệu từ cơ sở dữ liệu mang lại nhiều lợi ích. Nó giống như việc ta có thể bẻ từng chiếc đũa trong một bó đũa lớn thay vì bẻ cả bó đũa. Ví dụ, các tài liệu người dùng tải lên được lưu trong bảng “document”. Bảng “user” có quan hệ một-nhiều với bảng “document”. Trong trường hợp này, lớp User là lớp cha, lớp Document là lớp con. Bảng “document” nhanh chóng trở nên rất lớn theo thời gian. Mỗi khi chúng ta lấy thông tin user và document tương ứng từ cơ sở dữ liệu, giả sử dữ liệu của document rất lớn, để ứng dụng không bị chậm do phải mất nhiều bộ nhớ để lưu trữ toàn bộ document của tất cả user, chúng ta sử dụng Lazy loading cho từng user như sau:

6. Loại bỏ các khối Try-Catch:

Trong JDBC, nếu có lỗi xảy ra khi làm việc với cơ sở dữ liệu, một ngoại lệ SQLException sẽ được ném ra. Do đó, chúng ta phải sử dụng khối try-catch để xử lý ngoại lệ. Hibernate giải quyết việc này bằng cách ghi đè toàn bộ các ngoại lệ JDBC thành các ngoại lệ không kiểm tra, và chúng ta không cần phải viết try-catch trong code của mình nữa.

7. Quản lý commit/rollback giao dịch:

Giao dịch là một nhóm hoạt động (với cơ sở dữ liệu) của một nhiệm vụ. Nếu một hoạt động không thành công, toàn bộ nhiệm vụ sẽ không thành công. Với JDBC, lập trình viên phải chủ động thực hiện commit khi tất cả các hoạt động của nhiệm vụ thành công, hoặc rollback khi có một hoạt động không thành công để kết thúc nhiệm vụ. Trong khi đó, Hibernate quản lý commit và rollback một cách tự động.

8. Hibernate Caching:

Hibernate cung cấp một cơ chế bộ nhớ đệm, giúp giảm số lần truy cập vào cơ sở dữ liệu của ứng dụng. Điều này mang lại hiệu suất tốt hơn cho ứng dụng của bạn. Hibernate lưu trữ các đối tượng trong phiên làm việc đến khi giao dịch được kích hoạt. Khi một truy vấn được thực hiện liên tiếp, giá trị được lấy từ phiên làm việc được tái sử dụng. Khi một giao dịch mới bắt đầu, dữ liệu được lấy lại từ cơ sở dữ liệu và được lưu trữ trong phiên làm việc. Hibernate cung cấp hai cấp độ bộ nhớ đệm. Chúng ta sẽ có bài viết chi tiết hơn về bộ nhớ đệm trong Hibernate.

Nếu bạn muốn làm việc với Hibernate, hãy tham khảo hướng dẫn sử dụng Hibernate cho người mới bắt đầu tại lcdung.top

Bài viết gốc được đăng tải tại lcdung.top

Có thể bạn quan tâm:

Xem thêm công việc hấp dẫn trong lĩnh vực CNTT trên TopDev

Exit mobile version