ORM với Hibernate (step by step bài số 2).

Hibernate, một opensource về ORM đã được phổ biến rộng rãi trong cộng đồng java. Bài viết này được viết theo dạng tutorial, là bài viết cơ sở để trình bày tiếp những bước phát triển tiếp theo của các opensource ORM sau này như đưa ra những cấu hình mạnh mẽ hơn, viết mã tuân theo chuẩn JPA, và nói về những bước phát triển tiếp theo của Hibernate mà có thể LINQ là cái mà Hibernate phải học hỏi.

Bây giờ chúng ta đi vào kiến trúc của Hibernate

 

Kiến trúc của Hibernate:


Trong bài này chúng ta sẽ tìm hiểu về kiến trúc của hibernate. Biểu đồ sau đây mô tả tổng thể về Hibernate:

image
Theo biểu đồ trên ta thấy Hibernate đã sử dụng database và các file cấu hình (.properties hay XML) để cung cấp một dịch vụ persistence cho ứng dụng của chúng ta.
Kiến trúc của Hibernate bao gồm 3 phần:

  • Quản lý kết nối: Dịch vụ quản lý kết nối của Hibernate cung cấp việc quản lý hết sức hiệu quả các connection đến database. Database connection luôn là phần đắt đỏ và nhiều rủi ro trong việc kiểm soát, chúng ta tốn nhiều tài nguyên để mở và đóng một connection, hơn nữa, việc xử lý dữ liệu phức tạp và có thể dẫn đến…….quên sót việc đóng kết nối hoặc đóng một cách không hợp lý. Điều này hoàn toàn không đơn giản và dẫn đến một ứng dụng đổ vỡ. (Một ví dụ là đóng nhiều kết nối trong 1 khối try...catch)
  • Quản lý transation (giao tác):dịch vụ quản lý giao tác cung cấp khả năng cho phép user thi hành nhiều phát biểu (statement) vào một thời điểm.
  • Object relational mapping:
    Công nghệ mapping dữ liệu dưới database thành dữ liệu trên object. Hibernate sẽ sử dụng SELECT, INSERT, UPDATE và DELETE trên các records và đưa thao tác dứoi database tương ứng với việc thao tác tên Object java.

Mục đích sau cùng của hibernate đó là ORM, nhưng nó phải thêm vào các dịch vụ quản lý Connnection và Transaction vì phát sinh từ vấn đề performance và sự khó khăn khi tự mình xử lý những dịch vụ này trên Object được persistent. Hibernate buộc phải sử dụng những công cụ quản lý kết nối và transation của bên thứ 3 để hoàn thiện mô hình của mình. Một ví dụ là Apache DBCP thường được sử dụng trong connection pooling với Hibernate.

Hibernate rất uyển chuyển, nó có thể tích hợp với những công nghệ khác để nhận đươc sự hỗ trợ tốt nhất, tiêu biểu có Spring.

 

Bắt đầu với Hibernate:


Trong phần này tôi sẽ trình bày cho bạn cách tạo một chương trình đơn giản để insert một dòng dữ liệu vào MySQL. Bạn cũng có thể chạy chương trình này bằng commandline. Tuy nhiên tôi sẽ dùng MySQL và eclipse cho demo này.

Cấu hình Hibernate:


Trước tiên ta đi vào cấu hình cho Hibernate, trong ứng dụng demo này, chúng ta sẽ sử dụng connection pooling và transaction management. Trước tiên, chúng ta đi vào file hibernate.cfg.xml, đây là file cấu hình chung nhất cho hệ thống sử dụng Hibernate, nó cài đặt những cấu hình mà Hibernate sẽ hoạt động.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
     <property name="hibernate.connection.driver_class">

com.mysql.jdbc.Driver</property>       <property name="hibernate.connection.url">

jdbc:mysql://localhost/hibernatetutorial</property>
      <property name="hibernate.connection.username">root</property>     <property name="hibernate.connection.password">root</property>
      <property name="hibernate.connection.pool_size">10</property>
      <property name="show_sql">true</property>
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="hibernate.hbm2ddl.auto">update</property>
      <!-- Mapping files -->
      <mapping resource="contact.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Và để tránh mọi bối rối khi bạn mới làm quen với Hibernate, tutorial này sẽ trình bày đầy đủ các bước tối thiểu và đảm bảo chương trình của sẽ chạy, kèm một điều kiện là bạn nhìn vào cấu hình phía trên, tôi đã tạo một kết nối đến database với usernamepassword được cung cấp. Bạn hãy chỉnh lại username và password cho đúng với hệ thống mysql của bạn, và một điều nữa đó là hãy tạo một database tên là hibernatetutorial .

Một số chi tiết trong file hibernate.cfg.xml như sau:
Server là localhost với database name là hibernatetutorial, sử dụng jdbc:mysql://localhost/hibernatetutorial.
username=root
password=root
connection pooling =10.
show_sql=true chỉ thị khi hệ thống hibernate chạy sẽ show ra những câu truy vấn mà thực tế hibernate sẽ yêu cầu database thực thi, chỉ thị này sử dụng để debug chương trình, nó nên bị tắt đi khi đóng gói triển khai cho khách hàng.

Mapping với các Object và Table thông qua file contact.hbm.xml(chỉ thị mapping resource)

Viết Class Persistent:
Hibernate sử dụng POJOs để map Database và Object chúng ta sẽ cấu hình các biến để map vào các cột tương ứng trong database. Hãy xem đoạn mã sau:

POJO persistence

Chúng ta đã có Object bằng Java, kế tiếp chúng ta sẽ map nó vào database như sau, sử dụng file contact.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class name="com.tutorial.hibernate.Contact" table="CONTACT">
   <id name="id" type="long" column="ID" >
   <generator class="assigned"/>
  </id>

  <property name="firstName">
     <column name="FIRSTNAME" />
  </property>
  <property name="lastName">
    <column name="LASTNAME"/>
  </property>
  <property name="email">
    <column name="EMAIL"/>
  </property>
</class> </hibernate-mapping>

Thế là xong, luôn luôn chúng ta cần 2 file, một file java là POJO- class java, một file hbm.xml để map nó vào database. Như chúng ta đã thấy ở trên, một cột trong database sẽ tương ứng một biến trong POJO.

Hãy kiểm tra lại file hibernate.cfg.xml một lần nữa để xem cấu hình kết nối đến database đã đúng chưa, chủ yếu là hãy quan tâm đến username và password. Kế tiếp chúng ta sẽ tạo một hàm main để chạy demo cho chương trình.

package com.tutorial.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class FirstExample {
    public static void main(String[] args) {
        Session session = null;
        Transaction tx=null;

        try {
            // This step will read hibernate.cfg.xml and prepare hibernate for
            // use
            SessionFactory sessionFactory = new Configuration().configure()
                    .buildSessionFactory();
            session = sessionFactory.openSession();
            tx=session.beginTransaction();
            // Create new instance of Contact and set values in it by reading
            // them from form object
            System.out.println("Inserting Record");
            Contact contact = new Contact();
            contact.setId(6);
            contact.setFirstName("Deepak");
            contact.setLastName("Kumar");
            contact.setEmail("deepak_38@yahoo.com");
            session.save(contact);
            tx.commit();
            System.out.println("Done");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            // Actual contact insertion will happen at this step
            session.flush();
            session.close();

        }

    }
}

Hãy chạy chương trình và vào database kiểm tra, nếu các Table được tạo, và một dòng dữ liệu được insert vào bảng contact, bạn đã thành công.

Bạn download demo tại đây : Hibernate tutorial bài 2 

(http://upload.knightage.net/download.php?file=7ccacb1a4ee961490fbe9f66b77f6919)

Ngoài demo đơn giản tôi giới thiệu ở trên nó còn cung cấp đầy đủ những truy vấn thông thường bao gồm:

 

  1. Demo về generator
  2. Hibernate với truy vấn UPDATE.
  3. Hibernate với truy vấn DELETE.
  4. Hibernate với truy vấn SELECT.
  5. Hibernate với truy vấn COUNT.
  6. Hibernate với truy vấn AVG().
  7. MAX
  8. MIN
  9. WHERE
  10. GROUP BY
  11. ORDER.
  12. CRITERIA: bằng, nhỏ hơn, lớn hơn, and, or.
  13. Và một số demo khác.

Mỗi demo được tách biệt ra từng file riêng lẻ nên rất dễ theo dõi.

Hibernate thật là  đơn giản.

 

(Tham khảo bài viết và demo trên  roseindia.net)

About Langthang

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

6 comments :

  1. Bài viết rất lý thú. Em đã bookmark blog này để học hỏi thêm.
    Ở trên anh có nói: "những bước phát triển tiếp theo của Hibernate mà có thể LINQ là cái mà Hibernate phải học hỏi."
    vậy cho em hỏi thêm, LINQ và Hibernate có cái gì giống nhau, cái gì khác. Hibernate cần học gì ở LINQ? Tức là ưu điểm LINQ ấy.
    Em có làm quen với LINQ mấy hôm, và thấy cũng như Hibernate, nó phục vụ cho việc xây dựng DataAccess Layer, nhưng chưa thấy được cái khác.
    Mong nhận được ý kiến của anh.

    khoibv

    ReplyDelete
  2. Bài viết khá hay! Đơn giản và dễ hiểu, cảm ơn bạn nhiều nhé! ^-^

    ReplyDelete
  3. Bài viết hay quá, rất có ích cho người mới làm quen Hibernate. Làm sao mình có thể liên lạc với bạn để hỏi thêm về Hibernate?

    ReplyDelete
  4. hic ko down duoc rui,ban up lai file duoc ko:(

    ReplyDelete
  5. Cám ơn vì bài viết hay. Tuy nhiên, link đã die hoặc vì sao đó mà mình không thể download được dù đang dùng mạng ở nhà (Viettel), quán net (VNPT), công ty (FPT)
    vui lòng up lên host nào dễ download tí
    http://mediafire.com chẳng hạn.

    ReplyDelete
  6. @LongTTH
    link download source ne http://www.roseindia.net/hibernate/HIbernateGettingStarted.shtml

    ReplyDelete