Bài giảng Phát triển Web với Java EE - Bài 6: Giới thiệu Hibernate Framework

Ý tưởng

 Cơ sở dữ liệu thường được thiết kế và lưu trữ theo hướng

quan hệ.

 Tuy nhiên phần mềm thường được xây dựng theo hướng

đối tượng.

 Đối với lập trình viên khi xây dựng phần mềm thường

muốn làm việc với các đối tượng và không phải nhớ đến

các dòng, các cột trong các bảng của cơ sở dữ liệu

 JDBC xử lý các CSDL lớn rất chậm (từ 1000 bảng trở lên),

đặc biệt nếu ứng dụng có khả năng kết nối với nhiều hệ

quản trị khác nhau, câu truy vấn trong mỗi hệ quản trị có

thể có cú pháp khác

 → Khó vận hành, bảo trì và xử lý sự cố với các CSDL lớnHibernate Framework là gì?

 Hibernate được phát triển bởi Gavin King từ năm 2001, là

một ORM framework thuần Java

 Hibernate là một phần mềm miễn phí

 Hibernate giúp lưu trữ và truy vấn dữ liệu quan hệ mạnh

mẽ và nhanh, cho phép bạn truy vẫn dữ liệu bằng ngôn

ngữ SQL mở rộng của Hibernate (HQL) hoặc bằng SQL

thuần.

pdf 47 trang kimcuc 9500
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phát triển Web với Java EE - Bài 6: Giới thiệu Hibernate Framework", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Phát triển Web với Java EE - Bài 6: Giới thiệu Hibernate Framework

Bài giảng Phát triển Web với Java EE - Bài 6: Giới thiệu Hibernate Framework
Bài 6: Giới thiệu Hibernate 
Framework 
Nôi dung bài học 
 Hibernate Framework là gì? 
 Hibernate vs JDBC 
 Vòng đời của Hibernate 
 Các bước sử dụng Hibernate 
 Cấu hình Hibernate 
Ý tưởng 
 Cơ sở dữ liệu thường được thiết kế và lưu trữ theo hướng 
quan hệ. 
 Tuy nhiên phần mềm thường được xây dựng theo hướng 
đối tượng. 
 Đối với lập trình viên khi xây dựng phần mềm thường 
muốn làm việc với các đối tượng và không phải nhớ đến 
các dòng, các cột trong các bảng của cơ sở dữ liệu 
 JDBC xử lý các CSDL lớn rất chậm (từ 1000 bảng trở lên), 
đặc biệt nếu ứng dụng có khả năng kết nối với nhiều hệ 
quản trị khác nhau, câu truy vấn trong mỗi hệ quản trị có 
thể có cú pháp khác 
 → Khó vận hành, bảo trì và xử lý sự cố với các CSDL lớn 
Hibernate Framework là gì? 
 Hibernate được phát triển bởi Gavin King từ năm 2001, là 
một ORM framework thuần Java 
 Hibernate là một phần mềm miễn phí 
 Hibernate giúp lưu trữ và truy vấn dữ liệu quan hệ mạnh 
mẽ và nhanh, cho phép bạn truy vẫn dữ liệu bằng ngôn 
ngữ SQL mở rộng của Hibernate (HQL) hoặc bằng SQL 
thuần. 
Hibernate Framework là gì? 
 Các thành phần của Hibernate project (các thành phần 
thư viện Hibernate). 
• Hibernate Core: Cung cấp các chức năng cơ bản của 
persistent 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 
Anootations, bao gồm Hibernate Validator. 
• Hibernate EntityManager : sử dụng EJB 3.0 API trong JSE 
hoặc với bất kỳ JEE nào. 
Hibernate Framework là gì? 
• Hibernate Tools : các tool tích hợp với Eclipse và Ant 
giúp tạo ra các persistent object từ 1 schema có sẵn 
trong database(reverse-engineering) và từ các file hbm 
sinh ra các class java thực hiện các persistent object rồi 
Hibernate tự tạo tá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. 
So sánh 2 giải pháp JDBC và Hibernate 
JDBC Hibernate 
Với JDBC, lập trình viên phải viết mã để lập bản đồ dữ liệu của một 
mô hình đối tượng sang dữ liệu của một mô hình quan hệ và lược 
đồ cơ sở dữ liệu tương ứng của nó 
Hibernate là giải pháp ORM linh hoạt và mạnh mẽ để lập bản đồ các 
lớp Java vào các bảng cơ sở dữ liệu. Hibernate tự quản lý bản đồ này 
bằng cách sử dụng các tập tin XML, vì vậy lập trình viên không cần 
phải viết mã cho điều này. 
Với JDBC, các bản đồ của các đối tượng Java với các bảng cơ sở dữ 
liệu và ngược lại được quản lý bởi các lập trình viên bằng tay 
Hibernate cung cấp một hệ thống transparent persistence. 
JDBC chỉ hỗ trợ native Structured Query Language (SQL). Lập trình 
viên phải tự tìm ra cách phù hợp để truy cập cơ sở dữ liệu 
Hibernate cung cấp HQL mở rộng ( không phụ thuộc vào kiểu cơ sở dữ 
liệu ) đồng thời vẫn hỗ trợ SQL 
Ứng dụng sử dụng JDBC để xử lý các dữ liệu liên tục Nếu bảng cơ sở 
dữ liệu thay đổi thì lập trình viên phải viết lại mã 
Hibernate cung cấp bản đồ tự động. Nếu có sự thay đổi trong cơ sở 
dữ liệu thì chỉ cần sửa file XML 
Với JDBC, bộ đệm được quản lý bằng mã viết tay 
Hibernate, với Transparent Persistence, bộ đệm được đặt vào không 
gian làm việc của ứng dụng. Điều này nâng cao hiệu năng của ứng 
dụng nếu ứng dụng đọc cùng một dữ liệu nhiều lần 
Vòng đời của Hibernate 
 Class Session của Hibernate có một số các method quan 
trọng. Chúng được chia ra các nhóm như hình minh họa 
dưới đây. 
Vòng đời của Hibernate 
 Một đối tượng trong Hibernate có 1 trong 4 trạng thái: 
Transient (Tạm thời) 
 Persistent (Bền vững) 
 Removed (Đã bị xóa - dưới DB) 
 Detached (Đã bị tách riêng ra - so với session hiện tại) 
Vòng đời của Hibernate 
 Trường hợp bạn tạo mới một đối tượng java từ một Entity, đối tượng đó 
có tình trạng là Transient. Hibernate không biết về sự tồn tại của nó. Nó 
nằm ngoài sự quản lý của Hibernate. 
 Trường hợp bạn lấy ra đối tượng Entity bằng method get, load hoặc find, 
bạn có được một đối tượng nó tương ứng với 1 record dưới database. 
Đối tượng này có trạng thái Persistent. Nó được quản lý bởi Hibernate. 
 Session gọi một trong các method save,saveOrUpdate, persist, merge sẽ 
đẩy đối tượng Transient vào sự quản lý của Hibernate và đối tượng này 
chuyển sang trạng thái Persistent. Tùy tình huống nó sẽ insert hoặc 
update dữ liệu vào DB. 
 Session gọi evict(..) hoặc clear() để đuổi các đối tượng có trạng thái 
persistent (bền vững) ra khỏi sự quản lý của Hibernate, giờ các đối tượng 
này sẽ có trạng thái mới là Detected (Bị tách ra). Nếu nó không được 
đính (Attached) trở lại, nó sẽ bị bộ gom rác của Java quét đi theo cơ chế 
thông thường. 
 Sử dụng update(..), saveOrUpdate(..), merge(..) sẽ đính trở lại các đối 
tượng Detached vào lại. Tùy tình huống nó sẽ tạo ra dưới DB câu lệnh 
update hoặc insert. Các đối tượng sẽ trở về trạng thái Persistent (bền 
vững). 
 Session gọi method remove(..), delete(..) để xóa một bản ghi, đối tượng 
persistent giờ chuyển sang trạng thái Removed (Đã bị xóa). 
Các bước sử dụng hibernate 
 Bước 1: Tạo cơ sở dữ liệu 
 Bước 2: Tạo các POJO 
 Bước 3: Tạo file cấu hình hibernate.cfg.xml 
 Bước 4: Tạo các file mapping .hbm.xml 
 Bước 5: Khai báo các file mapping vào hibernate.cfg.xml 
 Bước 6: Xây dựng lớp HibernateUtil 
 Bước 7: Xây dựng các DAO & Sử dụng 
Ví Dụ Minh Họa 
Chuẩn bị cơ sở dữ liệu 
Table Khachhang 
Bước 1: Add thư viện hibernate 
 Link download thư viện: 
e4/4.0.0.CR4/hibernate-release-4.0.0.CR4.zip 
 Các thư mục chứa file thư viện cần add vào project: 
envers, jpa, required (thư mục optional chứa các file thư 
viện tùy chọn) 
Bước 2: Tạo file cấu hình hibernate.cfg.xml 
Bước 2: Tạo file cấu hình hibernate.cfg.xml 
Bước 3: Tạo POJO KhachHang. 
Bước 4:Tạo file mapping Khachhang.hbm.xml 
Bước 4:Tạo file mapping Khachhang.hbm.xml 
Chú ý 
• Tên class, thuộc tính: phải đúng theo tên class, thuộc tính trong POJO, có 
phân biệt hoa thường. 
• Tên table, column: đúng theo tên table, cột trong cơ sở dữ liệu, không 
phân biệt hoa thường. 
• Có thể lược bỏ tên table, column tên table, column sẽ được lấy từ tên 
class, thuộc tính. 
• Có thể lược bỏ length. 
• Có thể lược bỏ type nhưng sẽ làm giảm hiệu suất không nên dùng. 
Bước 5: Khai báo file mapping vào hibernate.cgf.xml 
Chú ý: “entity/Khachhang.hbm.xml” đường dẫn là dấu / 
Không được dùng dấu chấm “Entity.Khachhang.hbm.xml” 
Bước 6. Xây dựng lớp HibernateUtil 
Bước 6. Xây dựng lớp HibernateUtil 
Cấu trúc thư mục đã tạo 
Bước 7.Xây dựng lớp KhachHangDAO & sử dụng 
 Lấy danh sách khách hàng 
 Lấy thông tin khách hàng 
 Thêm thông tin khách hàng 
 Cập nhật thông tin khách hàng 
 Xóa thông tin khách hàng 
DAO: Lấy danh sách khách hàng 
 DAO: Lấy danh sách khách hàng 
Chú ý: 
• Sử dụng getCurrentSession() không cần phải open session và close session sau 
khi sử dụng xong. Tuy nhiên phải khai báo trong file config: 
thread 
• Sử dụng HibernateUtil.getSessionFactory().openSession(); 
 phải close sesion sau khi sử dụng xong. Session.Close(); 
Hiển thị danh sách khách hàng. 
Kết quả 
DAO: Lấy thông tin khách hàng 
- Sử dụng HibernateUtil.getSessionFactory().openSession(); 
 close sesion sau khi sử dụng xong. Session.Close(); 
Hiển thị thông tin khách hàng 
Kết quả 
 DAO: Thêm khách hàng. 
30 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
public static boolean themKhachHang(Khachhang kh) { 
 if(KhachHangDAO.layThongTinKhachHang(kh.getMaKhachHang()) != null) 
 return false; 
 Session session = HibernateUtil.getSessionFactory().openSession(); 
 try { 
 session.beginTransaction(); 
 session.save(kh); 
 session.getTransaction().commit(); 
 return true; 
 } catch (Exception e) { 
 session.getTransaction().rollback(); 
 System.out.println(e); 
 return false; 
 } finally { 
 session.close(); 
 } 
 } 
 Thêm khách hàng. 
31 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
public class main { 
 public static void main(String[] args) { 
 Khachhang kh = new Khachhang("KH05", "123123", "Trần Trọng Vĩnh", 
 "ttv@gmail.com", "097654321"); 
 if(KhachHangDAO.themKhachHang(kh) == true) 
 System.out.println("Thêm thành công!"); 
 else 
 System.out.println("Thêm không thành công!"); 
 } 
} 
Kết quả 
 Không lưu được tiếng việt 
32 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
13 
14 
15 
16 
 <property 
name="hibernate.dialect">org.hibernate.dialect.MySQLDialect 
 <property 
name="hibernate.connection.driver_class">com.mysql.jdbc.Driver 
jdbc:mysql://localhost:3306/quanlysach?useUnicode=true&characterEncoding=UTF-8 
 root 
 password 
 thread 
 Thêm đoạn sau vào phần cấu hình CSDL trong file config Hibernate 
?useUnicode=true&characterEncoding=UTF-8 
 DAO: Cập nhật thông tin khách hàng. 
33 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
public static boolean capNhatThongTinKhachHang(Khachhang kh) 
 { 
 if(KhachHangDAO.layThongTinKhachHang(kh.getMaKhachHang()) == null) 
 return false; 
 Session session=HibernateUtil.getSessionFactory().getCurrentSession(); 
 try { 
 session.getTransaction().begin(); 
 session.update(kh); 
 session.getTransaction().commit(); 
 return true; 
 } catch (Exception e) { 
 session.getTransaction().rollback(); 
 System.out.print(e); 
 return false; 
 } 
 } 
 Cập nhật thông tin khách hàng. 
34 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
public class main { 
 public static void main(String[] args) { 
 Khachhang kh = new Khachhang("KH05", "111111", "Lê Hồng Phong", 
 "ttv@gmail.com", "097654321"); 
 if (KhachHangDAO.capNhatThongTinKhachHang(kh) == true) { 
 System.out.println("Cập nhật thành công!"); 
 } else { 
 System.out.println("Cập nhật thất bại!"); 
 } 
 } 
} 
Kết quả 
 DAO: Xóa một khách hàng. 
35 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
18 
19 
20 
public static boolean xoaKhachHang(String maKhachHang) 
 { 
 Khachhang kh = KhachHangDAO.layThongTinKhachHang(maKhachHang); 
 if(kh == null) 
 return false; 
 Session session=HibernateUtil.getSessionFactory().getCurrentSession(); 
 try { 
 session.getTransaction().begin(); 
 session.delete(kh); 
 session.getTransaction().commit(); 
 return true; 
 } catch (Exception e) { 
 session.getTransaction().rollback(); 
 System.out.print(e); 
 return false; 
 } 
 } 
 Xóa một khách hàng. 
36 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
public class main { 
 public static void main(String[] args) { 
 if (KhachHangDAO.xoaKhachHang("KH05") == true) { 
 System.out.println("Xóa thành công!"); 
 } else { 
 System.out.println("Xóa thất bại!"); 
 } 
 } 
} 
Kết quả 
Giới thiệu 
 Hibernate được thiết kế để hoạt động với nhiều môi 
trường khác nhau vì thế nó cần được cấu hình khi sử 
dụng. 
37 
Cấu Hình Cơ Bản 
38 
• Cấu hình cơ sở dữ liệu. 
• Khai báo các file mapping .hbm.xml 
Cấu hình cơ sở dữ liệu 
39 
1 
2 
3 
4 
5 
 ...... 
Cấu hình cơ sở dữ liệu 
40 
1 
2 
3 
4 
5 
6 
7 
org.hibernate.dialect.MySQLDialect 
com.mysql.jdbc.Driver 
’ jdbc:mysql://localhost:3306/quanlysach?useUnicode=true&characterEncoding=UTF-8 
root 
password 
• hibernate.dialect : loại cơ sở dữ liệu được sử dụng. 
• hibernate.connection.driver_class: driver được sử dụng. 
• Hibernate.connection.url: url cơ sở dữ liệu. 
Sử dụng ?useUnicode=true&characterEncoding=UTF-8 để có thể 
lưu dữ liệu unicode xuống cơ sở dữ liệu. 
• hibernate.connection.username: username. 
• hibernate.connection.password: password. 
. hibernate.connection.pool_size: số lượng kết nối tối đa tới 
CSDL tại một thời điểm. 
Cấu hình cơ sở dữ liệu 
41 
Tên cơ sở dữ liệu Tên property 
DB2 org.hibernate.dialect.DB2Dialect 
HypersonicSQL org.hibernate.dialect.HSQLDialect 
Infomix org.hibernate.dialect.InformixDialect 
Ingres org.hibernate.dialect.IngresDialect 
Interbase org.hibernate.dialect.InterbaseDialect 
MySQL org.hibernate.dialect.MySQLDialect 
Oracle (any version) org.hibernate.dialect.OracleDialect 
Oracle 9 org.hibernate.dialect.Oracle9Dialect 
hibernate.dialect : loại cơ sở dữ liệu được sử dụng. 
Ví dụ: org.hibernate.dialect.MySQLDialect  MySQL 
Khai báo file mapping 
42 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
""> 
 org.hibernate.dialect.MySQLDialect 
 com.mysql.jdbc.Driver 
 jdbc:mysql://localhost:3306/quanlysach 
 root 
 password 
Chú ý: “entity/Khachhang.hbm.xml” đường dẫn là dấu / 
Không được dùng dấu chấm “Entity.Khachhang.hbm.xml” 
Các Cấu Hình Tùy Chọn Khác 
43 
• Các thuộc tính về Configuration 
• JDBC và các thuộc tính về Connection. 
• Các thuộc tính về Transaction 
• Các thuộc tính về khác. 
Ngoài các cấu hình cơ bản, việc cấu hình hibernate còn rất nhiều tùy chọn 
khác để điều khiển cách thức hoạt động của hibernate. Thông thường các 
thuộc tính này nếu không được khai báo sẽ có giá trị mặc định. 
Các thuộc tính về Configuration. 
KHTN CNTT 44 
Tên thuộc tính Ý nghĩa Giá trị 
hibernate.show_sql In tất cả các câu truy vấn SQL đã dùng ra console 
(phục vụ debug) 
True, False 
hibernate.format_sql In các câu SQL đã dùng ra file log và console 
(phục vụ debug) 
True, False 
hibernate.default_schema Tên table mặc định, nếu trong câu SQL không chỉ 
rõ table đang dùng. 
Tên CSDL. 
VD: table 
HocSinh 
hibernate.default_catalog Tên cơ sở dữ liệu mặc định, nếu trong câu SQL 
không chỉ rõ cơ sỡ dữ liệu đang dùng. 
Tên CSDL. 
VD: 
quanlyhocsinh 
hibernate.max_fetch_dept
h 
Độ sâu join fetch (tự động join các bảng trong 
quá trình mapping) 
Chỉ nên từ 0 - 3 
hibernate.order_updates Thay đổi mặc định hibernate sẽ update khóa 
chính của một đối tượng trước, sau đó mới tới 
các cột còn lại. 
True, false 
hibernate.generate_statisti
cs 
True, false 
Các thuộc tính về Transaction. 
45 
Tên thuộc tính Ý nghĩa Giá trị 
hibernate.transaction.flush
_before_completion 
Nếu là true thì session sẽ tự động flush trước khi 
hòan thành. 
True, False 
hibernate.transaction.auto
_close_session 
Tự động đóng session sau khi hoàn thành. True, False 
Các thuộc tính khác. 
46 
Tên thuộc tính Ý nghĩa Giá trị 
hibernate.current_session
_context_class 
Các tùy chỉnh cho session hiện tại 
Jta, thread, managed, 
custom.Class 
hibernate.query.factory_cl
ass 
Chọn phương pháp phân tích cú 
pháp HQL, mặc định là true. 
ASTQueryTranslatorFactory 
ClassicQueryTranslatorFactory 
XIN CẢM ƠN! 

File đính kèm:

  • pdfbai_giang_phat_trien_web_voi_java_ee_bai_6_gioi_thieu_hibern.pdf