Giới thiệu về Hibernate – GP Coder (Lập trình Java)

Hibernate Framework là gì ?

ORM

Như chúng ta đã biết, ORM (Object Relational Mapping) framework là một cơ chế cho phép người lập trình thao tác với database một cách hoàn toàn tự nhiên thông qua các đối tượng. Lập trình viên hoàn toàn không quan tâm đến loại database sử dụng SQL Server, MySQL, PostgreSQL, …

ORM giúp đơn giản hoá việc tạo ra tài liệu, thao tác dữ liệu và truy vấn tài liệu. Đó là một kỹ thuật lập trình để ánh xạ đối tượng người dùng vào tài liệu được tàng trữ trong cơ sở tài liệu .

Peristence layer

Một ứng dụng có thể được chia làm 3 phần như sau: giao diện người dùng (presentation layer), phần xử lý nghiệp vụ (business layer) và phần chứa dữ liệu (data layer). Cụ thể ra, business layer có thể được chia nhỏ thành 2 layer con là business logic layer và persistence layer.

  • Business logic layer: các tính toán logic nhằm thỏa mãn yêu cầu người dùng.
  • Persistence layer: chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ – Relational DBMS). Persistence sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu trữ dữ liệu vào các Relational DBMS.

Hibernate

Hibernate là một trong những ORM Framework. Hibernate framework là một framework cho persistence layer. Như vậy, nhờ có Hibernate framework mà giờ đây khi bạn phát triển ứng dụng bạn chỉ còn chú tâm vào những layer khác mà không phải bận tâm nhiều về persistence layer nữa.

Hibernate giúp lập trình viên viết ứng dụng Java hoàn toàn có thể map những object ( POJO ) với hệ quản trị cơ sở tài liệu quan hệ ( database ), và tương hỗ triển khai những khái niệm lập trình hướng đối tượng người tiêu dùng với cơ dữ liệu quan hệ .Hibernate giúp tàng trữ và truy vấn tài liệu quan hệ can đảm và mạnh mẽ và nhanh. Hibernate được cho phép bạn truy vẫn tài liệu trải qua Java Persistence API ( JPA ) hoặc bằng ngôn từ SQL lan rộng ra của Hibernate ( HQL ) hoặc bằng SQL thuần ( Native SQL ) .

Hibernate vốn là một thư viện sinh ra để làm việc với mọi loại database, nó không phụ thuộc vào bạn chọn loại database nào. Nếu Java là “Viết 1 lần chạy mọi nơi” thì Hibernate là “Viết 1 lần chạy trên mọi loại database”.

Lợi ích của Hibernate Framework

Hibernate Framework có những quyền lợi như dưới đây :

  • Mã nguồn mở và nhẹ: Hibernate Framework là mã nguồn mở có giấy phép LGPL và nhẹ.
  • Hiệu suất nhanh: Hiệu suất của Hibernate Framework là nhanh bởi vì bộ nhớ cache được sử dụng trong nội bộ Hibernate Framework. Có hai loại bộ nhớ cache trong Hibernate Framework, gồm bộ nhớ cache cấp một (first level cache) và bộ nhớ cache cấp hai (second level cache). Bộ nhớ cache cấp một được enable mặc định.
  • Truy vấn cơ sở dữ liệu độc lập: HQL (Hibernate Query Language) là phiên bản hướng đối tượng của SQL. Nó tạo ra các truy vấn cơ sở dữ liệu độc lập. Vì vậy, bạn không cần phải viết các truy vấn cơ sở dữ liệu cụ thể. Trước Hibernate, nếu dự án có cơ sở dữ liệu bị thay đổi, chúng ta cần phải thay đổi truy vấn SQL dẫn đến risk và dễ gây lỗi.
  • Tạo bảng tự động: Hibernate framework cung cấp phương tiện để tạo ra các bảng cơ sở dữ liệu một cách tự động. Vì vậy, không cần phải tốn công sức tạo ra các bảng trong cơ sở dữ liệu thủ công.
  • Đơn giản lệnh join phức tạp: Có thể lấy dữ liệu từ nhiều bảng một cách dễ dàng với Hibernate framework.
  • Cung cấp thống kê truy vấn và trạng thái cơ sở dữ liệu: Hibernate hỗ trợ bộ nhớ cache truy vấn và cung cấp số liệu thống kê về truy vấn và trạng thái cơ sở dữ liệu.

Database

Hibernate tương hỗ hầu hết toàn bộ RDBMS chính, ví dụ điển hình : Oracle, Microsoft SQL Server, PostgreSQL, MySQL, …

Kiến trúc Hibernate

Kiến trúc Hibernate gồm có nhiều đối tượng người tiêu dùng như đối tượng người dùng persistent, session factory, transaction factory, connection factory, session, transaction, …

Persistence object

Chính là những POJO object map với những table tương ứng của cơ sở tài liệu quan hệ. Nó như là những container chứa tài liệu từ ứng dụng để lưu xuống database, hay chứa tài liệu tải lên ứng dụng từ database .

Configuration

Là đối tượng người dùng Hibernate tiên phong bạn tạo trong bất kể ứng dụng Hibernate nào và chỉ cần tạo một lần trong quy trình khởi tạo ứng dụng. Nó đại diện thay mặt cho một tập tin thông số kỹ thuật hoặc thuộc tính nhu yếu của Hibernate. Đối tượng Configuration phân phối hai thành phần chính :

  • Database Connection: Thao tác này được xử lý thông qua một hoặc nhiều tệp cấu hình được Hibernate hỗ trợ. Các tệp này là hibernate.propertieshibernate.cfg.xml.
  • Class Mapping Setup: Thành phần này tạo ra kết nối giữa các lớp Java và các bảng cơ sở dữ liệu.

Session Factory

Là một interface giúp tạo ra session liên kết đến database bằng cách đọc những thông số kỹ thuật trong Hibernate configuration .SessionFactory là đối tượng người tiêu dùng nặng ( heavy weight object ) nên thường nó được tạo ra trong quy trình khởi động ứng dụng và lưu giữ để sử dụng sau này .SessionFactory là một đối tượng người dùng luồng bảo đảm an toàn ( Thread-safe ) và được sử dụng bởi toàn bộ những luồng của một ứng dụng .Mỗi một database phải có một session factory. Vì vậy, nếu bạn đang sử dụng nhiều cơ sở tài liệu thì bạn sẽ phải tạo nhiều đối tượng người tiêu dùng SessionFactory. Giả sử ta sử dụng MySQL và Oracle cho ứng dụng Java của mình thì ta cần có một session factory cho MySQL, và một session factory cho Oracle .

Hibernate Session

Một session được sử dụng để có được một liên kết vật lý với một cơ sở tài liệu. Đối tượng Session là nhẹ và được phong cách thiết kế để được tạo ra instance mỗi khi tương tác với cơ sở tài liệu. Các đối tượng người dùng liên tục được lưu và truy xuất trải qua một đối tượng người dùng Session .Các đối tượng người dùng Session không nên được mở trong một thời hạn dài chính do chúng thường không phải là luồng bảo đảm an toàn ( thread-unsafe ) và chúng cần được tạo ra và được đóng khi thiết yếu .Mỗi một đối tượng người dùng session được Session factory tạo ra sẽ tạo một liên kết đến database .

Transation

Một Transaction đại diện thay mặt cho một đơn vị chức năng thao tác với cơ sở tài liệu và hầu hết những RDBMS tương hỗ tính năng transaction. Các transaction trong Hibernate được giải quyết và xử lý bởi trình quản trị transaction và transaction ( từ JDBC hoặc JTA ) .Transaction bảo vệ tính toàn vẹn của phiên thao tác với cớ sở dữ liệu. Tức là nếu có một lỗi xảy ra trong transaction thì toàn bộ những tác vụ thực thi sẽ thất bại .Transaction là một đối tượng người dùng tùy chọn và những ứng dụng Hibernate hoàn toàn có thể chọn không sử dụng interface này, thay vào đó quản trị transaction trong code ứng dụng riêng .

Query

Các đối tượng người dùng Query sử dụng chuỗi truy vấn SQL ( Native SQL ) hoặc Hibernate Query Language ( HQL ) để lấy tài liệu từ cơ sở tài liệu và tạo những đối tượng người tiêu dùng .

Criteria

Đối tượng Criteria được sử dụng để tạo và triển khai những tiêu chuẩn truy vấn để lấy những đối tượng người tiêu dùng từ database .

Tại sao nên dùng Hibernate thay vì JDBC

Object Mapping

Với JDBC ta phải map những trường trong bảng với những thuộc tính của Java object một cách “ thủ công bằng tay ”. Với Hibernate sẽ tương hỗ ta map một cách “ tự động hóa ” trải qua những file thông số kỹ thuật map XML hay sử dụng những anotation .JDBC sẽ map Java object với table như sau :


//rs là ResultSet trả về từ câu query get dữ liệu bảng user.
List users = new ArrayList<>();
while(rs.next()) {
     User user = new User();
     user.setId(rs.getInt("id"));
     user.setUsername(rs.getString("username"));
     user.setPassword(rs.getString("password"));
     user.setCreatedDate(rs.getDate("createdDate"));
     users.add(user);
 }

Cũng với table user đó sử dụng những anotaion để Hibernate hoàn toàn có thể map một cách “ tự động hóa ” như sau .


@Entity
@Table(name = "user")
@Data
public class UserModel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotEmpty
    @Column(name = "username")
    private String username;

    @NotEmpty
    @Column(name = "password")
    private String password;

    @NotEmpty
    @Column(name = "createdDate")
    private Date createdDate;
}

HQL

Hibernate cung ứng những câu lệnh truy vấn tựa như SQL, HQL của Hibernate tương hỗ rất đầy đủ những truy vấn đa hình như, HQL “ hiểu ” những khái niệm như thừa kế ( inheritance ), đa hình ( polymorphysm ), và link ( association )

Database Independent

Code sử dụng Hibernate là độc lập với hệ quản trị cơ sở tài liệu, nghĩa là ta không cần biến hóa câu lệnh HQL khi ta chuyển từ hệ quản trị CSDL MySQL sang Oracle, hay những hệ quản trị CSDL khác … Do đó rất dễ để ta biến hóa CSDL quan hệ, đơn thuần bằng cách đổi khác thông tin thông số kỹ thuật hệ quản trị CSDL trong file thông số kỹ thuật .


//used MySQL
com.mysql.jdbc.Driver

// used Oracle
oracle.jdbc.driver.OracleDriver

Ví dụ khi ta muốn lấy 10 bản ghi tài liệu của một table từ 2 CSDL khác nhau .

Với JDBC ta có câu truy vấn như sau.


# MySQL
SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 10; 

# SQL Server
SELECT TOP 10 column_name FROM table_name ORDER BY column_name ASC;

Với Hibernate câu truy vấn không thay đổi với cả 2 CSDL.


Session.CreateQuery("SELECT E.id FROM Employee E ORDER BY E.id ASC").SetMaxResults(10).List();

Minimize Code Changes

Khi ta thay đổi (thêm) cột vào bảng, với JDBC ta phải thay đổi những gì:

  • Thêm thuộc tính vào POJO class.
  • Thay đổi method chứa câu truy vấn “select”, “insert”, “update” để bổ sung cột mới.
  • Có thể có rất nhiều method, nhiều class chứa các câu truy vấn như trên.

Với Hibernate ta chỉ cần:

  • Thêm thuộc tính vào Entity class.
  • Cập nhật Hibernate Annotation để map column – property..

Lazy Loading

Với những ứng dụng Java thao tác với cơ sở tài liệu lớn hàng trăm triệu bản ghi, việc có sử dụng Lazy loading trong truy xuất tài liệu từ database mang lại quyền lợi rất lớn .Ví dụ những file tài liệu do người dùng upload được lưu ở 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 class User là class cha, class Document là class con. Bảng document nhanh gọn đầy lên theo thời hạn. Mỗi khi ta lấy thông tin user và document tương ứng từ database giả sử tài liệu document là rất lớn, để ứng dụng không bị chậm vì phải mất nhiều bộ nhớ để chứa hàng loạt document của hàng loạt user, ta vận dụng Lazy loading cho từng user như sau .


// Declaring fetch type for one to many association in your POJO
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private Set documents = new HashSet();

// To fetch user with document use initialize() method as follows
User user = (User)session.get(User.class, new Integer(100));

// This code will fetch all products for user 100 from database 'NOW'
documents = user.getDocuments();

Loại bỏ Try-Catch Blocks

Sử dụng JDBC nếu lỗi xảy khi tao tác với database thì sẽ có exception SQLexception ném ra. Bởi vậy ta phải sử dụng try-catch block để giải quyết và xử lý ngoại lệ .Hibernate giải quyết và xử lý việc này giúp bạn bằng cách nó override hàng loạt JDBC exception thành Unchecked Exception và ta không cần viết try-catch trong code của mình nữa .

Quản lý commit / rollback Transaction

Transaction là nhóm những hoạt động giải trí ( với database ) của một tác vụ. Nếu một hoạt động giải trí không thành công xuất sắc thì hàng loạt tác vụ không thành công xuất sắc .

Với JDBC lập trình viên phải chủ động thực hiện commit khi toàn bộ hoạt động của tác vụ thành công, hay phải rollback khi có một hoạt động không thành công để kết thúc tác vụ.

Với Hibernate thì ta không cần quan tâm đến commit hay rollback, Hibernate đã quản lý nó giúp ta rồi.

Hibernate Caching

Hibernate cung ứng một chính sách bộ nhớ đệm, giúp giảm số lần truy vấn vào database của ứng dụng càng nhiều càng tốt. Điều này sẽ có công dụng tăng performance đáng kể cho ứng dụng của bạn .Hibernate tàng trữ những đối tượng người tiêu dùng trong session khi transation được kích hoạt. Khi một query được thực thi liên tục, giá trị được tàng trữ trong session được sử dụng lại. Khi một transaction mới khởi đầu, tài liệu được lấy lại từ database và được tàng trữ session. Hibernate phân phối hai Lever Cache : bộ nhớ cache cấp một ( first level cache ) và bộ nhớ cache cấp hai ( second level cache ) .Chúng ta sẽ tìm hiểu và khám phá cụ thể hơn về Cache trong Hibernate ở những bài viết sau đó .

Associations

Thật thuận tiện để tạo một link giữa những bảng bằng Hibernate như quan hệ một-một, một-nhiều, nhiều-một và nhiều-nhiều trong Hibernate bằng cách sử dụng những Annotation để ánh xạ đối tượng người dùng của bảng .Chẳng hạn, tất cả chúng ta có bảng Person quan hệ 1-1 với bảng PersonDetail. Với JDBC, tất cả chúng ta phải viết SQL để triển khai INNER JOIN giữa 2 bảng. Với Hibernate, chỉ đơn thuần thêm Annotation @ OneToOne như sau :

JPA Annotation Support

Hibernate implement đặc tả JPA, do đó tất cả chúng ta hoàn toàn có thể sử dụng những Annotation của JPA như @ Entity, @ Table, @ Column, … Nhờ đặc thù này, tất cả chúng ta hoàn toàn có thể thuận tiện quy đổi giữa những ORM Framework mà không cần phải sử đổi code .

Connection Pooling

Như tất cả chúng ta đã biết, Connection Pooling giúp tăng performance nhờ vào sử dụng lại những liên kết khi có nhu yếu thay vì việc tạo liên kết mới .Một số Connection Pooling được tương hỗ bởi Hibernate : C3p0, Apache DBCP .Chúng ta hoàn toàn có thể thuận tiện tích hợp với những thư viện Connection Pooling có sẵn chỉ với vài dòng thông số kỹ thuật như sau :


5
20
300
50
3000

Trên đây là một số ít khái niệm cơ bản về Hibernate mà tôi muốn ra mắt đến những bạn. Trong những bài viết tiếp theo tất cả chúng ta sẽ cùng khám phá cách setup và sử dụng những API của Hibernate .

Tài liệu tham khảo:

5.0

Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé!

Shares

Bình luận

phản hồi