Thứ Năm, 11 tháng 8, 2016

Hibernate One-to-Many Relationship trên MySQL – Mối quan hệ 1-n giữa 02 object sử dụng Hibernate kết hợp MySQL

Hibernate One-to-Many Relationship trên MySQL – Mối quan hệ 1-n giữa 02 object sử dụng Hibernate kết hợp MySQL

Tác giả: Nguyễn Anh Khoa

Mục đích: Tiếp tục loạt bài về Hibernate, chủ đề lần này chúng ta sẽ thực hiện cấu hình hibernate cho quan hệ 1-n giữa 2 table được cài đặt trên MySQL.

Hibernate One-to-Many Relationship trên MySQL – Mối quan hệ 1-n giữa 02 object sử dụng Hibernate kết hợp MySQL

Tác giả: Nguyễn Anh Khoa

Mục đích: Tiếp tục loạt bài về Hibernate, chủ đề lần này chúng ta sẽ thực hiện cấu hình hibernate cho quan hệ 1-n giữa 2 table được cài đặt trên MySQL.

 

Yêu cầu:

Để thực hiện được bài demo này, các bạn cần những tool sau đây:

·         NetBean IDE 6.9.1

·         JDK 6 update 22

·         Apache Tomcat v6

·         My SQL Database Server v5.x

 

Nắm vững cách cài đặt về Hibernate cơ bản và mối quan hệ 1-1, quí vị có thể xem lại 02 chủ đề theo đường link bên dưới:

·         Hibernate với MySQL (https://www.facebook.com/TrongKhanh.Kieu/posts/276063232766390)

·         Hibernate one-to-one relationship (https://www.facebook.com/TrongKhanh.Kieu/posts/276354746070572)

 

Trong chủ đề này, chúng ta sẽ dùng 2 table là Employee và Address để mô tả quan hệ 1-n, một employee sẽ có nhiều address. Bài demo này thực hiện 3 chức năng chínhtìm kiếm employee theo tên, thêm employee, addressxóa employee, address.

Tạo database

Chúng ta cần tạo table Employee và Address như sau vào MySQL Server:

 

 

1.       Mở command line  để login vào MySQL Server

2.       Copy đoạn SQL script này vào cửa sổ command line:

 

 

USE JAVA;

 

DROP TABLE IF EXISTS address;

DROP TABLE IF EXISTS employee;

 

CREATE TABLE IF NOT EXISTS employee(

    empId INTEGER NOT NULL,

    empName VARCHAR(50) NOT NULL,

    PRIMARY KEY (empId)

);

 

CREATE TABLE IF NOT EXISTS address(

    addId INTEGER NOT NULL AUTO_INCREMENT,

    addDetail VARCHAR(50) NOT NULL,

    addPhone VARCHAR(15) NOT NULL,

    addEmpId INTEGER NOT NULL,

    PRIMARY KEY(addId),

    CONSTRAINT FOREIGN KEY(addEmpId) references employee(empId)  

);

 

INSERT INTO employee(empId,empName) VALUES(60113,'Nguyen Anh Khoa');

INSERT INTO employee(empId,empName) VALUES(60333,'Nguyen Duong Kha');

INSERT INTO employee(empId,empName) VALUES(60441,'Vu Thai Linh');

 

INSERT INTO address(addDetail,addPhone,addEmpId) VALUES('Ho Chi Minh','0999999999',60113);

INSERT INTO address(addDetail,addPhone,addEmpId) VALUES('Binh Dinh','0902116116',60113);

INSERT INTO address(addDetail,addPhone,addEmpId) VALUES('Ha Noi','0978759255',60333);

INSERT INTO address(addDetail,addPhone,addEmpId) VALUES('Da Nang','0999999999',60333);

INSERT INTO address(addDetail,addPhone,addEmpId) VALUES('Binh Thuan','0902116116',60441);

INSERT INTO address(addDetail,addPhone,addEmpId) VALUES('Dong Nai','0978759255',60441);

 

 

 

Kết quả là table Employee and Address được tạo:

 

3.       Kết nối datasource, thực hiện tương tự như 2 chủ đề trước!

____________________________________________________________________________________

Tạo Web Application Project

1.       Click File à New à Project. Chọn Web Application trong mục Java Web.

Click Next.

2.       Nhập tên project là Hibernate_One_Many. Click Next.

3.       Chọn Server là Apache Tomcat 6.0.26 và Java EE version là Java EE5.

Click Next.

4.       Chọn framework cho project là Hibernate 3.2.5

Chọn Database Connection và Database Dialect như hình vẽ:

10.png

Click Finish.

_____________________________________________________________________________________ Configure file hibernate.cfg.xml

            Phần này chúng ta làm tương tự như 02 chủ đề đã hướng dẫn

·         Hibernate Hello world 

·         Hibernate one-to-one relationship

_____________________________________________________________________________________

Tạo file HiberntaeUtil.java - Helper file

1.       Chọn File à New File àOther

2.       Chọn đến Category Hibernate và chọn HibernateUtil,java.

3.       Đặt tên cho class là HibernateUtil và tên package.

4.       Click Finish.

File phát sinh này, chúng ta không cần chỉnh sửa gì vì NetBean đã generate ra method mà ta cần dùng.

_____________________________________________________________________________________

Tạo Hibernate Mapping File và POJO

·        Tạo Hibernate Reverse Engineering file

1.       Chọn File à New Fileà Other

2.       Chọn Category Hibernate và chọn Hibernate Reverse Engineering Wizard

Click Next.

3.       Nhập tên file là hibernate.reveng và Folder là src/java.

Click Next.

4.       Available Tables chứa tất cả các table có trong database mà ta đang kết nối.

Chọn table muốn sử dụng và click Add hoặc chọn tất cả các table Add all.

Ở đây chúng ta chọn Employee.

 

Click Finish.

·        Tạo Hibernate Mapping File và POJO

1.       Chọn File à New File à Other (Ctr + N).

2.       Chọn Category Hibernate và chọn Hibernate Mapping File and POJOs

Click Next.

3.       Tên file config và file reverse engineering phải được load trong combo box.

Check vào JDK 5 Language Features.

Nhập vào tên package.

Tất cả như hình vẽ bên dưới.

Click Finish.

____________________________________________________________________________________

Cấu hình cho quan hệ 1-n

NetBean đã generate các file theo đúng như mục đích của chúng ta là quan hệ one-to-many nên không cần chỉnh sửa gì cả.

Chúng ta tìm hiểu xem quan hệ one-to-many trong Hibernate được configure như thế nào.

1.       File address.hbm.xml:

 

2.       File employee.hbm.xml:

Trong property set,  nếu chưa có thuộc tính cascade thì các bạn thêm vào như bên dưới.

Vì nhiều address quan hệ với chỉ một employee nên property many-to-one được dùng để cấu hình cho file address.hbm.xml và set được dùng để cấu hình cho file employee.hbm.xml.

·         name :  Tên của quan hệ

·         class : Tên đầy đủ của class có quan hệ với class này

·         lazy fetch : Khi truy vấn dữ liệu từ table cha, chúng ta cũng cần lấy dữ liệu của các table con và ngược lại. Nhưng vấn đề là lúc nào chúng ta thật sự cần giá trị của những table con. Có 2 trường hợp xảy ra:

Ø  Chúng ta muốn những table con được load cùng lúc (cùng trong một transaction) với table cha.

Ø  Chúng ta chỉ muốn lấy giá trị của table cha, còn các table con sẽ được load trong một transaction khác khi thật sự cần đến nó. Điều này sẽ đảm bảo tính performance của ứng dụng.

 Thuộc tính lazy dùng để xác định điều này. Tùy theo đối tượng trong mối quan hệ mà thuộc tính lazy có thể có những những giá trị khác nhau.

Lazy trong property many-to-one hay còn gọi là single-valued association có 3 giá trị là proxy, non-proxyfalse.

Ø  lazy = false : Khi một table được load, table khác trong quan hệ cũng sẽ được load ngay lập tức.

Ø  lazy = proxy (default): Table có quan hệ sẽ được load khi một phương thức bất kì của đối tượng mô tả table này được gọi. Ví dụ khi load một address thì employee có quan hệ với address này chỉ được load khi nào chúng ta gọi : address.getEmployee().toString().

Ø  Lazy = non-proxy : Tương tự như trường hợp proxy nhưng các phương thức để kích hoạt việc load các table ở đây phải là các getter. Ví dụ: address.getEmployee().getEmpName().

Lazy trong quan hệ one-to-many (được set trong property set) có 3 giá trị là false, true và extra:

Ø  lazy = false : tương tự như quan hệ many-to-one

Ø  lazy = true (default) : tương tự như proxy quan hệ many-to-one.

Ø  lazy = extra : Khi load table có quan hệ, Hibernate sẽ không load một lần cả collection mà khi gọi item nào thì item đó mới được load.

Fetch là cách thức Hibernate sẽ load các table có quan hệ:

·         fetch = join : Các table trong quan hệ sẽ được load 1 lần bằng một câu lệnh SQL với OUTER JOIN theo kiểu lazy = false.

·         fetch = select : Table có quan hệ sẽ được load bằng các câu select sau khi table được load theo kiểu lazy = proxy hoặc lazy = true.Các câu lệnh SQL được tạo tương tự như sau:

Select * From Employee;

Select * From Address Where empId =1 ;

Select * From Address Where empId =2 ;

Select * From Address Where empId =3 ;

 Có N record thì sẽ có N+1 câu SQL được tạo.

·         fetch = subselect : Table có quan hệ sẽ được load theo kiểu như đoạn code SQL bên dưới:

Select * From Employee

Select * From Address Where empId IN (Select empId From Employee)

                                    Như vậy trường hợp này cũng chỉ dùng 2 câu SQL để load tất cả các record.

·         batch-size : Table có quan hệ sẽ được load theo kiểu như subselect nhưng số record được load trong 1 câu lệnh SQL được xác định bởi giá trị batch-size. Trường hợp này chúng ta sẽ cấu hình như thế này:

( Đoạn này mình chỉ ví dụ cho dễ hiểu, file Employee.hbm.xml sẽ không được cấu hình batch-size nhé!)

 

                                    Ví dụ một employee có 5 address thì các câu lệnh SQL được tạo như sau:

Select * From Employee;

Select * From Address Where empId In (1,2) ;

Select * From Address Where empId In (3,4) ;

Select * From Address Where empId In (5) ;

Như vậy với cách cấu hình này có  (Number of record % batch-size + 1) +1 câu lệnh SQL được tạo.

_____________________________________________________________________________________

Tạo Web Application

·        Create DAO class

1.       Tạo mới class Java, đặt tên là StudentDAO , package la sample.dao:

2.       Implement class DAO như sau:

·         Thuộc tính session và hàm tạo không tham số:

·         Hàm findByEmployeeName() để tìm kiếm employee theo tên:

 

·         Hàm insertEmp():

·         Hàm insertAddress():

·         Hàm deleteEmployee() :

·         Hàm deleteAddress() :

·        Sửa file index.jsp để tạo trang input dữ liệu cho chức năng Search:

·        Tạo Servlet

·         Chọn File à New File à Other (Ctr + N)

·         Chọn Category Web và chọn Servlet. Click Next.

·         Đặt tên cho servlet là Controller và package là sample.servlet. Click Next.

·         Click Finish.

·         Sửa lại file Controller.java như sau:

- Chức năng Search :

 

Thêm đoạn else if cho chức năng add employee và address:

Thêm đoạn else if cho chức năng xóa employee và address:

·        Tạo file show.jsp

1.       Add thư viện JSTL

2.       Tạo file show.jsp với nội dung như sau:

( Nội dung của file show.jsp nối tiếp nhau trong phần khoanh đỏ)

 

**********

 

 

**********

 

_____________________________________________________________________________________

Cấu trúc Source của Project:

Clean and build, run project.

Khi click Add, Delete hoac Update trên trang show.jsp, trang show.jsp sẽ load lại và hiển thị kết quả vừa được sửa.

Kết quả khi run như sau:

1.       Trang index:

2.       Kết quả Search:

Nhập thông tin cho student mới và add.

_____________________________________________________________________________________

Cấu hình Hibernate bằng Annotation

Từ file hibernate.cfg.xml và hibernate.reveng.xml đã tạo:

1.       Chọn File à New File à Other (Ctr + N).

2.       Chọn Category Hibernate và chọn Hibernate Mapping File and POJOs

Click Next.

3.       Tên file config và file reverse engineering phải được load trong combo box.

Check vào JDK 5 Language Features và EJB 3 Annotations

Nhập vào tên package.

Tất cả như hình vẽ bên dưới:

Click Finish.

Code được generate đúng với mục đích chúng ta nên không cần phải chỉnh sửa nhiều. Về ý nghĩa của các annotation thì tương tự như trong file xml nên các bạn chỉ cần đổi tên package import ở những class cần thiết, comment lại phần khoanh đỏ trong file hibernate.cfg.xml như hình dưới đây rồi test thử:

_____________________________________________________________________________________

Chúc mừng các bạn đã vừa hoàn thành xong bài Demo Hibernate One-to-Many relationship với NetBean 6.9.1!

Hẹn gặp lại ở các chủ đề sau!

 

Không có nhận xét nào:

Đăng nhận xét