Tuy nhiên khi làm việc với các ứng dụng hướng đối tượng, bạn có thể gặp một số vấn đề khi bạn cố gắng persist các đối tượng vào trong mô hình quan hệ.. 1.2-Khái niệm Nhibernate: Nhibern
Trang 1TRƯỜNG CAO ĐẲNG NGUYỄN TẤT THÀNH
KHOA CÔNG NGHỆ THÔNG TIN
GIANG BỘI LINH
SỬ DỤNG NHIBERNATE (OQL -OBJECT QUERY LANGUAGE) ĐỂ HIỆN THỰC
CHƯƠNG TRÌNH QUẢN LÝ VIỆC MUA BÁN
SÁCH CHO MỘT CỬA HIỆU SÁCH
KHOÁ LUẬN TỐT NGHIỆP
TPHCM 7 - 2009
Trang 2TRƯỜNG CAO ĐẲNG NGUYỄN TẤT THÀNH
KHOA CÔNG NGHỆ THÔNG TIN
GIANG BỘI LINH - 206205325
SỬ DỤNG NHIBERNATE (OQL -OBJECT QUERY LANGUAGE) ĐỂ HIỆN THỰC
CHƯƠNG TRÌNH QUẢN LÝ VIỆC MUA BÁN
SÁCH CHO MỘT CỬA HIỆU SÁCH
KHOÁ LUẬN TỐT NGHIỆP
KHOÁ 2006 – 2009
Trang 3NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
Tp.HCM, Ngày Tháng Năm
Giáo viên hướng dẫn
Trang 4NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
Tp.HCM, Ngày Tháng Năm
Giáo viên phản biện
Trang 5MỤC LỤC
LỜI CẢM ƠN 8
ĐỀ CƯƠNG CHI TIẾT 9
LỜI NÓI ĐẦU 13
TÓM TẮT KHÓA LUẬN 14
CHƯƠNG 1TÓM LƯỢC NHIBERNATE 16
1.1-Khái niệm Persistence: 17
1.2-Khái niệm Nhibernate: 17
1.3-Lịch sử phát triển Nhibernate: 18
1.4-Các đặc tính 19
1.5-Kiến trúc Nhibernate: 20
1.6-Các bước xây dựng ứng dụng NHibernate: 21
1.7-Các khái niệm: 24
CHƯƠNG 2PHÂN TÍCH ỨNG DỤNG WEBSITE BÁN SÁCH 42
2.1.Nhận diện tác nhân, mục tiêu của từng tác nhân (actor): 43
2.2.Sơ đồ Use Case: 45
2.3.Mô tả các Use Case: 47
2.3.1.Đăng nhập: 47
2.3.2.Đăng ký: 48
2.3.3.Quản lý chủ đề: 48
2.3.4.Quản lý loại sách: 50
2.3.5.Quản lý nhà xuất bản: 51
2.3.6.Thêm sách: 53
2.3.7.Cập nhật sách: 53
2.3.8.Xem thông tin phiếu nhập: 54
2.3.9.Lập phiếu nhập: 55
2.3.10.Xem thông tin hóa đơn: 56
2.4.Sơ đồ Domain Model: 57
Trang 62.5.Mô tả các lớp trong Domain – Model: 57
2.5.1.Lớp Sach: 57
2.5.2.Lớp NhaXuatBan: 58
2.5.3.Lớp Nguoi_Dung: 58
2.5.4.Lớp Phan_Quyen: 59
2.5.5.Lớp Phieu_Thu: 59
2.5.6.Lớp ChuDe: 59
2.5.7.Lớp LoaiSach: 59
2.5.8.Lớp PhieuNhap: 60
2.5.9.Lớp ChiTietPhieuNhap: 60
2.5.10.Lớp TinhTrang: 60
2.5.11.Lớp QuyDinh: 60
2.5.12.Lớp HoaDon: 60
2.5.13.Lớp ChiTietHoaDon: 61
2.5.14.Lớp KhuyenMai: 61
2.5.15.Lớp DonGia: 61
2.5.16.Lớp Tac_Gia: 62
2.5.17.Lớp Sach_TacGia: 62
CHƯƠNG 3THIẾT KẾ 63
3.1.Sơ đồ cơ sở dữ liệu quan hệ: 64
3.2.Mô tả sơ đồ: 64
3.2.1.Bảng Sach: 64
3.2.2.Bảng Nha_Xuat_Ban: 66
3.2.3.Bảng Phan_Quyen: 66
3.2.4.Bảng Nguoi_Dung: 66
3.2.5.Bảng Loai_Sach: 67
3.2.6.Bảng Chi_Tiet_Phieu_Nhap: 68
3.2.7.Bảng Phieu_Nhap: 68
3.2.8.Bảng Tinh_Trang: 69
Trang 73.2.9.Bảng Qui_Dinh: 69
3.2.10.Bảng Hoa_Don: 69
3.2.11.Bảng Chi_Tiet_Hoa_Don: 70
3.2.12.Bảng Khuyen_Mai: 71
3.2.13.Bảng Don_Gia: 71
3.2.14.Bảng Chu_De: 72
3.2.15.Bảng Phieu_Thu: 72
3.2.16.Bảng Tac_Gia: 73
3.2.17.Bảng Sach_TacGia: 73
3.3.Giao diện một số màn hình: 74
CHƯƠNG 4CÀI ĐẶT, ĐÁNH GIÁ KẾT QUẢ VÀ HƯỚNG PHÁT TRIỂN 76
4.1.Môi trường cài đặt: 77
4.2.Đánh giá kết quả: 77
4.2.1.Kết quả đạt được: 77
4.2.2.Việc chưa làm được: 78
4.3.Hướng phát triển: 78
DANH MỤC TÀI LIỆU THAM KHẢO 79
Trang 8LỜI CẢM ƠN
Em xin chân thành cảm ơn Khoa Công Nghệ Thông Tin Trường Cao Đẳng Nguyễn Tất Thành, đã tạo điều kiện tốt cho chúng thực hiện tốt đề tài tốt nghiệp này
Em xin chân thành cảm ơn thầy Nguyễn Duy Thái đã tận tình hướng dẫn, chỉ bảo em trong suốt thời gian thực hiện đề tài Mong thầy nhận ở em lời cảm ơn sâu sắc
Chúng em xin chân thành cảm ơn quý thầy cô trong khoa đã tận tình giảng dạy, trang bị cho chúng em những kiến thức quý báu trong những năm học vừa qua Chúng tôi xin chân thành cảm ơn các bạn bè, người đồng hành tốt đã chân thành đóng góp ý kiến để chúng tôi hoàn chỉnh khóa luận này
Chúng con xin gởi lời cảm ơn sâu sắc đến ba mẹ, ông bà đã sinh thành, nuôi dưỡng, giáo dục chúng con thành người Chúng con nghĩ hàng triệu lời cảm ơn cũng không bù đắp được công lao ấy Chúng con hứa sẽ cố gắng hết sức để luôn là niềm tự hào của ba mẹ
Mặc dù chúng em đã cố gắng hoàn thành khóa luận trong phạm vi và khả năng cho phép nhưng chắc chắn sẽ không tránh khỏi những thiếu xót, kính mong sự cảm thông và tận tình chỉ bảo của quý thầy cô và các bạn
Tp.HCM, ngày 25 tháng 07 năm 2009 Sinh viên thực hiện
Giang Bội Linh
Trang 9ĐỀ CƯƠNG CHI TIẾT
Tên đề tài: SỬ DỤNG NHIBERNATE (OQL -OBJECT QUERY LANGUAGE) ĐỂ
HIỆN THỰC CHƯƠNG TRÌNH QUẢN LÝ VIỆC MUA BÁN SÁCH CHO MỘT CỬA HIỆU SÁCH (ỨNG DỤNG WEB)
Giáo viên hướng dẫn: Thầy Nguyễn Duy Thái
Thời gian thực hiện: từ 09/03/2008 đến cuối 21/06/2008
Loại đề tài: Ứng dụng Web
Nội Dung Đề Tài:
SỬ DỤNG NHIBERNATE (OQL -OBJECT QUERY LANGUAGE) ĐỂ HIỆN THỰC CHƯƠNG TRÌNH QUẢN LÝ VIỆC MUA BÁN SÁCH CHO MỘT CỬA HIỆU SÁCH (ỨNG DỤNG WEB)
Phương pháp thực hiện:
Hệ thống lại kiến thức về ngôn ngữ lập trình C#, ASP.NET, SQL Server 2005
và phương pháp lập trình hướng đối tượng theo kiến trúc 3 tầng
Tìm hiểu ngôn ngữ truy vấn NHIBERNATE
Khảo sát hiện trạng, xác định các yêu cầu của đề tài:
Yêu cầu chức năng
Yêu cầu phi chức năng
Phân tích các yêu cầu
Trang 10 Hiểu phương pháp lập trình hướng đối tượng theo kiến trúc 3 tầng
Hiểu được cách thức truy vấn trên nền NHIBERNATE
Kết quả đạt được:
Viết báo cáo
Trình bày kết quả đạt được
2 (29/3 – 4/4) 1 Điều chỉnh lại kết quả tuần 1
2 Xác định các actor, mục tiêu của từng actor
3 Xác định các use case trong hệ thống
4 Vẽ sơ đồ use case
5 Mô tả cho các use case quan trọng
6 Xây dựng sườn khóa luận
GIANG BỘI LINH
3 (5/4 – 11/4) 1 Điều chỉnh lại kết quả tuần 2
2 Tìm hiểu Domain model
3 Xây dựng domain model(sơ đồ lớp quan niệm)
4 Bắt đầu viết quyển báo cáo
GIANG BỘI LINH
4 (12/4– 18/4) 1 Điều chỉnh lại kết quả tuần 3 GIANG BỘI
Trang 112 Điều chỉnh lại Domain Model và use case
3 Viết quyển báo cáo
LINH
5 (19/4– 25/4) 1 Điều chỉnh lại kết quả tuần 4
2 Thiết kế cơ sở dữ liệu
3 Viết quyển báo cáo
GIANG BỘI LINH
6 (26/4– 2/5) 1 Điều chỉnh lại kết quả tuần 5
2 Thiết kế giao diện
3 Viết quyển báo cáo
GIANG BỘI LINH
7 (3/5–9/5) 1 Điều chỉnh lại kết quả tuần 6
1 Hoàn chỉnh các thiết kế
2 Bổ sung vào quyển báo cáo
GIANG BỘI LINH
8(10/5 – 16/5) 1 Cài đặt cơ sở dữ liệu
2 Lập trình
GIANG BỘI LINH
9 (17/5 – 23/5) 1 Điều chỉnh lại kết quả tuần 8
2 Lập trình
3 Bổ sung kết quả vào quyển báo cáo
GIANG BỘI LINH
10(24/5– 30/5) 1 Điều chỉnh lại kết quả tuần 9
2 Lập trình
3 Bổ sung kết quả vào quyển báo cáo
GIANG BỘI LINH
11(31/5-6/6) 1 Điều chỉnh lại kết quả tuần 10
2 Lập trình
3 Bổ sung kết quả vào quyển báo cáo
GIANG BỘI LINH
12(7/6-13/6) 1 Điều chỉnh kết quả tuần 11
2 Lập trình
3 Bổ sung vào quyển báo cáo
GIANG BỘI LINH
Trang 1214(21/6- 27/6) 1 Cài đặt thử nghiệm, chỉnh sửa GIANG BỘI
LINH 15(28/6- 4/7) 1 Nộp báo cáo cho Khoa
2 Báo cáo PowerPoint
3 Chuẩn bị bảo vệ
GIANG BỘI LINH
Trang 13LỜI NÓI ĐẦU Trên thị trường kinh tế cạnh tranh, quảng cáo, thời gian và hiệu quả kinh
doanh là các vấn đề mà doanh nghiệp cần quan tâm.Việc ứng dụng thương mại điện
tử để xậy dựng website bán sách là hình thức khá phổ biến hiện nay.Làm sao để quảng cáo sản phẩm một cách bắt mắt, rộng rãi mà không cần mất nhiều chi phí ? Làm sao để khách hàng có thể tham gia mua sản phẩm ở bất cứ nơi nào mà không cần phải đến trực tiếp cửa hàng ? Làm sao để doanh nghiệp có thể đáp ứng các yêu cầu đặt hàng của khách hàng một cách nhanh chóng và chính xác đó là các mục tiêu của ứng dụng : WEBSITE QUẢN LÝ CỬA HÀNG BÁN SÁCH.Bên cạnh đó, trang web còn trợ một số chức năng sau:
Quản lý hóa đơn, chi tiết hóa đơn
Quản lý thông tin khuyến mãi (tiền mặt)
Thống kê
Trang 14TÓM TẮT KHÓA LUẬN I-HƯỚNG GIẢI QUYẾT
-Xây dựng ứng dụng theo kiến trúc 3 tầng
-Khảo sát các website bán sách
-Xây dựng sơ đồ Use Case và đặc tả Use Case
-Xây dựng Domain Model
-Cài đặt cơ sở dữ liệu và ứng dụng
II- YÊU CẦU CHỨC NĂNG VÀ PHI CHỨC NĂNG
1.Yêu cầu chức năng:
Đăng nhập
Tìm kiếm sách: chi tiết,đơn giản
Đặt mua hàng
Thay đổi thông tin cá nhân, mật khẩu
Đăng ký tài khoản
Trang 152.Yêu cầu phi chức năng:
Chương trình phải đảm bảo đáp ứng các yêu cầu: lưu trữ và khai thác dữ liệu
Thông tin được cung cấp chính xác
Giao diện hài hòa
Trang 16CHƯƠNG 1 TÓM LƯỢC NHIBERNATE
Nội dung:
1.1.Khái niệm Persistence
1.2.Khái niệm NHibernate
Trang 171.1-Khái niệm Persistence:
Persistence là nói đến khả năng một đối tượng duy trì sự tồn tại sau thời gian sống của chương trình tạo ra nó Nếu không có khả năng này, dữ liệu chỉ tồn tại trong bộ nhớ và sẽ mất đi khi bộ nhớ tắt hoặc máy tính shutdown
Có một vài loại persistence, ví dụ: khi bạn hiệu chỉnh một file source thì file đó sẽ được persist xuống đĩa để lần sau rút trích và sử dụng Các file được lưu trên đĩa là hình thức phổ biến nhất của persistence Trong ứng dụng, ví dụ như shopping cart thì persist dữ liệu trong một CSDL quan hệ
CSDL quan hệ là một sự chọn lựa phổ biến để lưu dữ liệu vì dữ liệu dễ dàng được tạo và truy cập bằng SQL Mô hình được sử dụng bởi CSDL quan hệ được gọi
là mô hình quan hệ, biểu diễn dữ liệu dưới dạng bảng hai chiều Các table có thể liên quan nhau thông qua việc sử dụng khóa chính và khóa ngoại Khóa chính đảm bảo không có hai record trong bảng có cùng giá trị Khóa ngoại tham chiếu đến khóa chính được lưu trong một bảng khác
CSDL quan hệ được thiết kế để quản lý dữ liệu theo mô hình quan hệ Tuy nhiên khi làm việc với các ứng dụng hướng đối tượng, bạn có thể gặp một số vấn đề khi bạn cố gắng persist các đối tượng vào trong mô hình quan hệ Với sự khác biệt của hai mô hình, làm thế nào để chúng làm việc được với nhau Để giải quyết vấn
đề này object/relational mapping (ORM) ra đời
1.2-Khái niệm Nhibernate:
Nhibernate là một giải pháp Object-relational mapping (ORM) cho nền NET, được hiểu như là kỹ thuật ánh xạ từ mô hình đối tượng với các table trong cơ
sở dữ liệu quan hệ Trong đó các đối tượng ánh xạ với các bảng và quan hệ trong database sẽ được ánh xạ với sự ràng buộc liên quan trong đối tượng và làm giảm công việc lập trình của người lập trình viên, 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
Trang 18Chức năng chính của Nhibernate là ánh xạ những lớp đối tượng xuống cơ sở
dữ liệu quan hệ Ngoài ra Nhibernate còn cho phép người sử dụng có thể thực hiện những câu truy vấn xuống cơ sở dữ liệu thông qua các đối tượng
Hình 1 - Ứng dụng NET với ADO.NET
Hình 2 - Ứng dụng NET với NHibernate
1.3-Lịch sử phát triển Nhibernate:
Nhibernate là biến thể từ Hibernate bên Java, được bắt đầu bởi Tom Barrett
và hiện nay là một thư viện mã nguồn mở
Phiên bản 1.0 gồm các tính năng của Hibernate 2.1 và một số tính năng của Hibernate 3.0
Nhibernate 1.2.1 phát hành vào tháng 11-2007, được giới thiệu với nhiều tính năng của Hibernate 3.0 hỗ trợ cho NET 2.0
Nhibernate 2.0 được phát hành vào 8-2008 Nó tương đương với các tính năng của phiên bản Hibernate 3.2 Với phiên bản này, Nhibernate không hỗ trợ cho NET 1.1
Trang 19Nhibernate 2.1 hiện đang được phát triển và sẽ được phát hành vào giữa năm
2009
Nhibernate 3.0 sẽ là phiên bản đầu tiên hỗ trợ NET 3.5
1.4-Các đặc tính
Hỗ trợ trên nhiều hệ quản trị cơ sở dữ liệu khác nhau
Ánh xạ các đối tượng quan hệ xuống cơ sở dữ liệu : Sử dụng file xml để mô
tả cách thức mapping trực tiếp từ đối tượng tương ứng với các bảng trong cơ sở dữ liệu
Hỗ trợ tốt các kiểu quan hệ như one-to-many, many-to-many giữa các đối tượng, quản lý các mối kết hợp, kế thừa giữa các đối tượng Ngoài ra, Nhibernate còn hỗ trợ các kiểu dữ liệu người dùng, truy xuất dữ liệu theo nhóm(Collection), danh sách(List)…
Hỗ trợ ngôn ngữ truy vấn đối tượng (HQL - Hibernate Query Language) cho phép người dùng thực hiện các câu truy vấn tương tự SQL.Ngoài ra, Nhibernate còn
hỗ trợ Criteria API thực hiện truy vấn theo cách của người lập trình hướng đối tượng
Trang 20Được dùng để cấu hình Nhibernate, các ứng dụng sử dụng đối tượng Configuration
để chỉ rõ vị trí của các tài liệu ánh xạ
ITransaction
Trang 21Có tác dụng nhóm nhiều thao tác vào trong một đơn vị làm việc Nếu bất kỳ thao tác nào thất bại thì tất cả các thao tác trước đều bị roll back và đơn vị làm việc đó sẽ dừng lại
IQuery và ICriteria
Hỗ trợ đa dạng hình thức truy vấn dữ liệu khác nhau Các câu truy vấn được viết bằng HQL hoặc SQL Ngoài ra, chúng còn cho phép xây dựng các câu truy vấn động, điều khiển tham số đầu vào, giới hạn số lượng kết quả trả về
1.6-Các bước xây dựng ứng dụng NHibernate:
Tạo bảng trong cơ sở dữ liệu
Tạo các lớp đối tượng cần persist
Tạo file ánh xạ có đuôi là hbm.xml cung cấp các thông tin để NHibernate persist các thuộc tính trong đối tượng với các trường trong bảng dữ liệu tương ứng, đồng thời chọn thuộc tính Build Action của file là EmBedded Resource
Tạo file cấu hình có đuôi là config để Nhibernate kết nối với database
Xây dựng các câu truy vấn và sử dụng các phương thức Nhibernate hỗ trợ để truy vấn trên các đối tượng
Trang 22private string _machude;
private string _tenchude;
private bool _xoa;
public string Id
{
get { return _machude; }
set { _machude = value; }
}
public string TenChuDe
{
get { return _tenchude; }
set { _tenchude = value; }
}
public bool Xoa
{
get { return _xoa; }
set { _xoa = value; }
<class name="DTO.ChuDe,DTO" table="Chu_De" lazy="false">
<id name="Id" column="MaChuDe">
<generator class="assigned" />
</id>
<property name="TenChuDe" column="TenChuDe" />
<property name="Xoa" column="Xoa" />
Trang 23NHibernate.Connection.DriverConnectionProvider</property>
<propertyname="connection.driver_class">
NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Data Source=GIANGBOILINH\SQLEXPRESS;Initial Catalog=BookDB;Integrated Security=True</property>
Bước 5 : Truy vấn với Nhibernate
Using namepace Nhibernate
Đối tượng Configuration sẽ tìm kiếm các file hbm.xml trong assembly
Tạo đối tượng session
Cho phép persist các đối tượng, truy vấn các đối tượng persistent
ITransaction quản lý các Transaction trong Nhibernate
Sử dụng SessionFactory để tạo thể hiện của Session:
ISessionFactory factory = fg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
ChuDe chude = new ChuDe();
Trang 24Qui ướ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
<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
Trang 25<class name="Event" table="events">
<id name="id" column="uid" type="long" unsaved-value="null">
<generator class="native"/>
</id>
<property name="name" type="string" length="100"/>
<property name="startDate" column="start_date" type="date"/>
<property name="duration" type="integer"/>
<many-to-one name="location" column="location_id" class="Location"/> <set name="speakers">
File ánh xạ được bắt đầu bằng thẻ hibernate-mapping
Thuộc tính set khai báo tên của các lớp persistent như: Speaker và Attendee
Thẻ class đị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
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 Nhibernate:
Trang 26 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 đó
Thẻ property
<property name="name" type="string" length="100"/>
<property name="startDate" column="start_date" type="date"/>
<property name="duration" type="integer"/>
Mỗi thẻ property này tương ứng với một thuộc tính trong đối tượng Event
Thuộc tính name là tên thuộc tính
Thuộc tính type xác định kiểu dữ liệu của thuộc tính
Column là tên cột tương ứng trong database
Trang 27<?xml version="1.0"?>
<hibernate-mapping package="com.manning.hq.ch03">
<class name="Location" table="locations">
<id name="id" column="uid" type="long">
<generator class="native"/>
</id>
<property name="name" type="string"/>
<property name="address" type="string"/>
</class>
</hibernate-mapping>
Đối với Event, element many-to-one định nghĩa tham chiếu giữa các đối tượng persistent Ánh xạ mối quan hệ many-to-one như sau:
<many-to-one name="location" column="location_id" class="Location"/>
Thuộc tính name cung cấp tên của thuộc tính trong đối tượng và thuộc tính column xác định column được sử dụng để lưu khóa ngoại đến bảng location Thuộc tính class cung cấp tên của lớp persistent cần quan hệ
Một câu hỏi phổ biến được đặt ra là: làm thế nào để tạo mối quan hệ many-to-one lazy - nghĩa là đối tượng được kết hợp với nó sẽ không được rút trích khi đối tượng cha được rút trích Các giải quyết là sử dụng proxied objects
Proxy:
Object proxy là cách tránh rút trích một đối tượng cho đến khi cần đến nó Định nghĩa nó bằng 2 cách:
1 Thêm thuộc tính proxy vào thẻ class:
<class name="Location" proxy="com.manning.hq.ch03.Location" >
Trang 28
</class>
2.Sử dụng thuộc tính lazy = "true" là cách ngắn nhất để định nghĩa lớp
persistent như proxy:
<class name="Location" lazy="true" > </class>
Cách sử dụng thể hiện proxied Location:
Session session = factory.openSession();
Event ev = (Event) session.load(Event.class, myEventId);
Location loc = ev.getLocation();
String name = loc.getName();
session.close();
Trả về thể hiện của Location là proxy Nhibernate lấy thể hiện Location khi
getName() được gọi
Trang 29public class Event {
private Set speakers;
Cascade:
Các thao tác lan truyền theo tầng trên một bảng (như delete) đến các bảng kết hợp Giả sử, khi delete Event, bạn cũng muốn delete các thể hiện Speaker kết hợp với Event Thay vì code trong ứng dụng sẽ thực hiện, Nhibernate có thể quản lý nó thay cho bạn
Các loại cascade: all, save-update, delete, delete-orphan
Element cascade được thêm vào many-to-one hoặc element collection Ví dụ cấu hình sau sẽ hướng dẫn Hibernate delete các Speaker con khi Event cha bị delete:
<set name="speakers" cascade="delete">
<key column="event_id"/>
Trang 30<one-to-many class="Speaker"/>
</set>
Duyệt các đối tượng kết hợp:
Bạn có thể rút trích các đối tượng kết hợp sử dụng outer join hoặc bằng câu lệnh SELECT Thuộc tính fetch cho phép bạn xác định các phương thức để sử dụng:
<many-to-one name="location" class="Location" fetch="join"/>
Khi thể hiện Event được load thì đối tượng Location kết hợp cũng sẽ được load bằng outer join Nếu muốn sử dụng câu lệnh select thì sẽ cài đặt như sau:
<many-to-one name="location" class="Location" fetch="select"/>
Association:
Giả sử trong ứng dụng của bạn, mỗi Event được tổ chức ở chỉ một Location Cách
mà biểu diễn điều này trong net là đối tượng Event có một trường Location Khi bạn rút trích Event, bạn muốn cả Location nữa Vì thế bạn phải liên kết Event và Location với nhau sử dụng quan hệ many-to-one
Định nghĩa các lớp Event và Location như sau:
public class Event {
private Long id;
private int duration;
private String name;
private DateTime startDate;
private Location location;
Trang 31public Event() { }
public Event(String name) {
this.name = name;
}
public Long getId() { return id; }
public void setId(Long id) {
this.id = id;
}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public DateTime getStartDate() { return startDate; }
public void setStartDate(DateTime startDate) {
this.startDate = startDate;
}
public int getDuration() { return duration; }
public void setDuration(int duration) {
this.duration = duration;
}
public Location getLocation() { return location; }
public void setLocation(Location location) {
this.location = location;
Trang 32}
}
public class Location {
private Long id;
private String name;
private String address;
public Location() { }
public Location(String name) {
this.name = name;
}
public Long getId() { return id; }
public void setId(Long id) {
this.id = id;
}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public String getAddress() { return address; }
public void setAddress(String address) {
Trang 33Mỗi lớp này sẽ cần một file ánh xạ tương ứng, trong trường hợp này là
Event.hbm.xml và Location.hbm.xml để định nghĩa các trường persistent và mối quan hệ giữa hai file này Đặt các file này cùng thư mục với Event.cs và
Location.cs Sau đây là hai file ánh xạ này:
Location.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Location" table="locations">
<id name="id" column="uid" type="long">
<generator class="native"/>
</id>
<property name="name" type="string"/>
<property name="address" type="string"/>
<class name="Event" table="events">
<id name="id" column="uid" type="long">
<generator class="native"/>
</id>
<property name="name" type="string"/>
<property name="startDate" column="start_date"
type="date"/>
<property name="duration" type="integer"/>
<many-to-one name="location" column="location_id" class="Location" />
Trang 34Chúng ta có một trường address trong Location Do thiết kế không tốt nên chúng ta
sẽ chia nhỏ địa chỉ thành 4 cột: street, city, state và zip code Và khi đó đối tượng Location sẽ như thế này:
public class Location{
private Long id;
private String name;
private String streetAddress;
private String city;
private String state;
private String zipCode;
// getters and setter omitted
Trang 35private Long id;
private String name;
private Address address = new Address();
// Other getter/setters omitted
public Address getAddress() { return address; }
public void setAddress(Address address) {
<class name="Location" table="locations">
<id name="id" column="uid" type="long">
<generator class="native"/>
</id>
<property name="name" type="string"/>
<component name="address" class="Address" >
<property name="streetAddress"
column="street_address" type="string"/>
<property name="city" type="string"/>
<property name="state" type="string"/>
Trang 36Bây giờ bạn có thể chèn dữ liệu vào đối tượng Location như sau:
Location location = new Location();
location.setName("Hilton Convention Center");
location.getAddress().setStreetAddress("950 North Stafford St.");
Trang 37</class>
</hibernate-mapping>
Lớp Event tương ứng như sau:
public class Event {
private Set speakers;
private Set attendees;
public void setSpeakers(Set speakers) {
Trang 38Quan hệ nhiều-nhiều:
Quan hệ nhiều-nhiều yêu cầu một bảng collection lưu tập hợp các đối tượng tham chiếu Giả sử Attendees có thể tham dự nhiều hơn một Event Ánh xạ many-to-many cho tập hợp các Attendees như sau:
<set name="attendees" table="event_attendees">
Rút trích lazy collection (cụ thể là attendees) như sau:
Session session = factory.openSession();
Event event = session.get(Event.class, eventId);
Set attendees = event.getAttendees();
session.close();
Persistent collection được lazy mặc định bởi Hibernate 3 Để làm cho collection không lazy, bạn phải khai báo rõ ràng như sau: lazy="false" trong mapping file:
Trang 39<set name="attendees" lazy="false">
<key column="event_id"/>
<one-to-many class="Attendee"/>
</set>
Ánh xạ quan hệ hai chiều:
Lớp Event cho phép bạn định vị từ thể hiện Event cha đến thể hiện Attendee con Tuy nhiên giả sử bạn muốn tại mối quan hệ hai chiều, cho phép một Attendee định
vị đến Event cha của nó Để thực hiện được điều này, đầu tiên bạn phải xác định thuộc tính Event trong lớp Attendee và cung cấp định nghĩa many-to-one trong file ánh xạ Attendee Kế tiếp định nghĩa inverse trong Event - thiết lập thuộc tính
inverse="true" để thông báo cho Nhibernate runtime mối quan hệ hai chiều này
Các bước được thực hiện như sau:
public class Attendee {
private Event event;
Trang 40Thêm thuộc tính inverse="true" trong file ánh xạ của Event như sau:
<set name="attendees" inverse="true">
<key column="event_id"/>
<one-to-many class="Attendee"/>
</set>
Show SQL:
Khi debug, bạn cần xem SQL được phát sinh Thiết lập thuộc tính show_sql là true
để phát sinh ra SQL trên console
Thiết lập thuộc tính trong file config
<property name="show_sql">true</property>
Joins:
Có 4 loại:
left join: lấy tất cả các thể hiện bên trái của mệnh đề join
right join: tất cả các thể hiện bên phải của mệnh đề join
full join: trả về các đối tượng hai bên của mệnh đề join