24/05/2018, 19:37

Xây dựng ứng dụng với Hibernate

“ Tier ” và “ Layer ”: tier thường được gắn với phần cứng về mặt vật lý (physical) còn layer thì dính đến vấn đề cách thức tổ chức bên trong của ứng dụng. Việc phân chia tier là “trong suốt” (transparent) đối ...

  “Tier” và “Layer”: tier thường được gắn với phần cứng về mặt vật lý (physical) còn layer thì dính đến vấn đề cách thức tổ chức bên trong của ứng dụng. Việc phân chia tier là “trong suốt” (transparent) đối với ứng dụng về mặt luận lý (logical). Điều này có nghĩa là khi ta phát triển một ứng dụng, chúng ta không bận tâm đến các thành phần (component) sẽ triển khai (deploy) ra sao mà chỉ chú ý là chúng ta sẽ tổ chức ứng dụng thành những layer như thế nào.

  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 hai layer con là business logic layer (các tính toán nhằm thỏa mãn yêu cầu người dùng) và persistence layer. 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.

Kiến trúc của Hibernate

Hibernate là một dự án open source chuyên nghiệp và là một thành phần cốt tuỷ của bộ sản phẩm JBoss Enterprise Middleware System (JEMS). JBoss, như chúng ta đã biết là một đơn vị của Red Hat, chuyên cung cấp các dịch vụ 24x7 về hỗ trợ chuyên nghiệp, tư vấn và huấn luyện sẵn sàng hỗ trợ bạn trong việc dùng Hibernate.

Các thành phần của Hibernate project

- Hibernate Core: Cung cấp các chức năng cơ bản của một persistence layer cho các ứng dụng Java với các APIs và hỗ trợ XML mapping metadata.

- Hibernate Annotations: Các map class với JDK 5.0 annotations, bao gồm Hibernate Validator.

- Hibernate EntityManager: Sử dụng EJB 3.0 EntityManager API trong JSE hoặc với bất kỳ JEE server nào.

- Hibernate Tools: Các tool tích hợp với Eclipse và Ant dùng cho việc sinh ra các persistence object từ một schema có sẵn trong database (reverse-engineering) và từ các file hbm sinh ra các class java để hiện thực các persistence object, rồi Hibernate tự tạo các object trong database (forward-engineering).

- NHibernate: Hibernate cho .Net framework.

- JBoss Seam: Một Java EE 5.0 framework cho phát triển các ứng dụng JSF, Ajax và EJB 3.0 với sự hỗ trợ của Hibernate. Seam hiện rất mới và tỏ ra rất mạnh để phát triển các ứng dụng Web 2.0. Nó tích hợp đầy đủ tất cả các công nghệ "hot" nhất hiện nay.

Thư viện: bạn có thể tìm ở lib của Hibernate Core 3.2.6 GA

antlr.jarcglib.jarasm.jarasm-attrs.jarscommons-collections.jarcommons-logging.jarhibernate3.jarjta.jardom4j.jarlog4j.jarhsqldb.jarjtds-1.2.jarservlet-2.3.1.jar

Các bạn có thể vào địa chỉ: www.hibernate.org để download Hibernate Core 3.2.6 GA

Hibernate được cấu hình theo hai bước:

 - Cấu hình service bao gồm: tham số kết nối CSDL, caching và tập các lớp persistent.

- Cung cấp cho Hibernate các thông tin về các lớp được persist.

Để giải quyết hai bước theo yêu cầu của Hibernate, chúng ta sẽ thảo luận từng vấn đề sau:

- Tạo file cấu hình hibernate.cfg.xml.

- Xây dựng các file định nghĩa ánh xạ để cung cấp cho Hibetnate các thông tin về các lớp persistent.

- Các lớp được sử dụng để persist và rút trích các lớp.

- Cấu hình nâng cao bao gồm: object caching và quản lý giao dịch.

  • Cấu hình cơ bản

Hibernate cung cấp 2 phương pháp cấu hình: file properties theo chuẩn của Java được gọi là hibernate.properties và file có định dạng XML gọi là hibernate.cfg.xml. Chúng ta sẽ sử dụng file cấu hình XML để cấu hình các service của Hibernate. Nếu cả hai file hibernate.propertieshibernate.cfg.xml được tìm thấy trong classpath của ứng dụng thì hibernate.cfg.xml sẽ override lên các thiết lập được tìm thấy trong hibernate.properties.

Trước khi cấu hình Hibernate, đầu tiên bạn nên xác định service giữ kết nối đến CSDL như thế nào. Kết nối đến CSDL có thể được cung cấp bởi Hibernate hoặc từ JNDI DataSource. Một phương pháp thứ ba là kết nối JDBC được cung cấp bởi người dùng.

Sử dụng kết nối JDBC được quản lý bởi Hibernate:

Sau đây là file cấu hình mẫu sử dụng loại kết nối JDBC được quản lý bởi Hibernate:

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5. <hibernate-configuration>  
  6. <session-factory>  
  7. <property name="connection.username">uid</property>  
  8. <property name="connection.password">pwd</property>  
  9. <property name="connection.url">jdbc:mysql://localhost/db</property>  
  10. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  11. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  12. <mapping resource="com/manning/hq/ch03/Event.hbm.xml"/>  
  13. <mapping resource="com/manning/hq/ch03/Location.hbm.xml"/>  
  14. <mapping resource="com/manning/hq/ch03/Speaker.hbm.xml"/>  
  15. <mapping resource="com/manning/hq/ch03/Attendee.hbm.xml"/>  
  16. </session-factory>  
  17. </hibernate-configuration>  

Để sử dụng JDBC connection được cung cấp bởi Hibernate, file cấu hình yêu cầu 5 thuộc tính: connection.driver_class, connection.url, connection.username, connection.password, dialect.

Thuộc tính dialect bảo cho Hibernate biết SQL dialect nào được sử dụng để thao tác. Nó được sử dụng để đảm bảo các câu Hibernate Query Language (HQL) được chuyển đổi đúng với SQL dialect dưới CSDL.

Hibernate cũng cần biết vị trí (đường dẫn tương đối so với classpath của ứng dụng) và tên của các mapping file - mô tả persistent classs.

Sử dụng JNDI DataSource

Để sử dụng Hibernate với kết nối CSDL được cung cấp bởi JNDI DataSource, bạn cần thay đổi một vài chỗ trong file cấu hình như sau:

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5. <hibernate-configuration>  
  6. <session-factory name="java:comp/env/hibernate/SessionFactory">  
  7. <property name="connection.datasource">jdbc/myDataSource</property>  
  8. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  9. <mapping resource="com/manning/hq/ch03/Event.hbm.xml"/>  
  10. <mapping resource="com/manning/hq/ch03/Location.hbm.xml"/>  
  11. <mapping resource="com/manning/hq/ch03/Speaker.hbm.xml"/>  
  12. <mapping resource="com/manning/hq/ch03/Attendee.hbm.xml"/>  
  13. </session-factory>  
  14. </hibernate-configuration>  

Bạn chỉ sử dụng loại cấu hình này khi sử dụng Hibernate với application server: Jboss, WebSphere...Thuộc tính connection.datasource phải có cùng giá trị với tên của JNDI DataSource trong cấu hình application server.

  • Tạo định nghĩa ánh xạ

Các định nghĩa ánh xạ được gọi là mapping document, được sử dụng để cung cấp cho Hibernate các thông tin để lưu trữ các đối tượng đến CSDL quan hệ. Các file ánh xạ cung cấp các đặc tính như tạo lược đồ CSDL từ tập hợp các file ánh xạ.

Các định nghĩa ánh xạ cho các đối tượng persistent có thể được lưu chung với nhau trong cùng một file. Phương pháp thích hợp hơn là định nghĩa cho mỗi đối tượng được lưu trong một file.

Quy ước đặt tên cho các file ánh xạ là sử dụng tên của persistent class với phần mở rộng hbm.xml. Ví dụ: file ánh xạ cho lớp Event có tên là Event.hbm.xml.

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  3. <hibernate-mapping package="com.manning.hq.ch03">  
  4. <class name="Event" table="events">  
  5. <id name="id" column="uid" type="long" unsaved-value="null">  
  6. <generator class="native"/>  
  7. </id>  
  8. <property name="name" type="string" length="100"/>  
  9. <property name="startDate" column="start_date" type="date"/>  
  10. <property name="duration" type="integer"/>  
  11. <many-to-one name="location" column="location_id" class="Location"/>  
  12. <set name="speakers">  
  13. <key column="event_id"/>  
  14. <one-to-many class="Speaker"/>  
  15. </set>  
  16. <set name="attendees">  
  17. <key column="event_id"/>  
  18. <one-to-many class="Attendee"/>  
  19. </set>  
  20. </class>  
  21. </hibernate-mapping>  

File ánh xạ bắt đầu bằng hibernate-mapping element. Thuộc tính package thiết lập package mặc định cho lớp. Thuộc tính set, bạn cần cung cấp tên của lớp persistent khác như: SpeakerAttendee.

Thẻ class bắt đầu định nghĩa ánh xạ cho lớp persistent xác định, thuộc tính table là tên của quan hệ (relational) được sử dụng để lưu các đối tượng.

Element <id> mô tả khóa chính của persistent class - tự động được phát sinh. Thuộc tính name định nghĩa các thuộc tính của persistent class sẽ được sử dụng để lưu giá trị của khóa chính.

Element <generate> được sử dụng để xác định tên của lớp phát sinh khóa chính cho record mới khi lưu nó. Ở đây chúng ta sử dụng lớp native.

Sau đây là danh sách các generator phổ biến được sử dụng trong Hibernate:

- increment - phát sinh id (loại long, short hoặc int) là duy nhất chỉ khi không có tiến trình khác chèn dữ liệu vào cùng bảng.

- identity - nó hỗ trợ cột id trong DB2, MySQL, MS SQL Server, Sybase và HypersonicSQL. Id được trả về có loại long, short hoặc int.

- sequence - phát sinh sequence sử dụng một sequence trong DB2, PostgreSQL, Oracle, SAP DB, McKoi hoặc Interbase. Id được trả về có loại long, short hoặc int.

- hilo - Bộ phát sinh hilo sử dụng thuật toán hilo để phát sinh id.

- native - Nó sẽ chọn id, sequence hoặc hilo phụ thuộc vào khả năng CSDL phía dưới.Thuộc tính unsaved-value mô tả giá trị của thuộc tính id cho các thể hiện transient của lớp đó.

0