Thứ Tư, 10 tháng 8, 2016

Hibernate Many-to-Many Relationship dùng DB SQL Server – Mối quan hệ m-n giữa 02 đối tượng sử dụng Hibernate trên CSDL SQL Server

Hibernate One-to-One Relationship – Mối quan hệ 1-1 giữa 02 đối tượng sử dụng Hibernate

Hibernate Many-to-Many Relationship dùng DB SQL Server – Mối quan hệ n-n giữa 02 đối tượng sử dụng Hibernate trên CSDL SQL Server

 

Mục đích: Mục đích của chủ đề này nhằm thực hiện mối quan hệ nhiều nhiều n-n giữa 02 object cũng dùng Hibernate nhưng sử dụng DB SQL Server. Bên cạnh đó, chúng tôi sẽ đưa ra một số thủ thuật và lưu ý khi thực hiện cài đặt Hibernate có quan hệ trên CSDL dùng SQL Server.

Hibernate Many-to-Many Relationship dùng DB SQL Server – Mối quan hệ n-n giữa 02 đối tượng sử dụng Hibernate trên CSDL SQL Server

 

Mục đích: Mục đích của chủ đề này nhằm thực hiện mối quan hệ nhiều nhiều n-n giữa 02 object cũng dùng Hibernate nhưng sử dụng DB SQL Server. Bên cạnh đó, chúng tôi sẽ đưa ra một số thủ thuật và lưu ý khi thực hiện cài đặt Hibernate có quan hệ trên CSDL dùng SQL Server.

 

Yêu cầu:

·         Nắm vững cách cài đặt đối tượng sử dụng Hibernate 3.2.5 (vui lòng xem lại bài Hibernate 3.2.5 in MVC Web Application with NetBeans 6.9.1 and SQL Server 2005 https://www.facebook.com/TrongKhanh.Kieu/posts/276067172765996)

·         Nắm vững cách cài đặt mối quan hệ 1-1 giữa 02 object sử dụng Hibernate (vui lòng xem lại bài Hibernate One-to-One Relationship cài đặt trên SQLServer https://www.facebook.com/TrongKhanh.Kieu/posts/276354746070572 ) và cách cài đặt mối quan hệ 1-n giữa 02 object sử dụng Hibernate kết hợp SQLServer (vui lòng xem lại bài Hibernate One-to-Many Relationship trên SQLServer https://www.facebook.com/TrongKhanh.Kieu/posts/276393309400049 )

·         Nắm vững kiến thức về OOP

·         Nắm vững kiến thức về mối quan hệ giữa các object khi vận dụng và cài đặt

·         Tools yêu cầu

o   NetBean IDE 6.9.1

o   JDK 6 update 22

o   Apache Tomcat v6.0.26

o   MS. SQL Server 2005

 

Trong phần nội dung này chúng tôi sẽ làm ví dụ trên mối quan hệ một user được cấp nhiều quyền – roles, và một roles sẽ có nhiều user sở hữu (ví dụ này tương tự như nội dung trong bài CMR n_n của EJB). Dữ liệu mô tả như sau

Ở trên chúng ta có 3 bảng bởi vì DBMS – MS SQL Server 2005 không hỗ trợ quan hệ nhiều nhiều, do vậy, giữa mối quan hệ nhiều nhiều khi implement, phải vận dụng bảng trung gian để chứa thông tin liên lạc giữa 02 quan hệ

Ở bài này, chúng tôi sẽ thực hiện hai chức năng chính đó là tạo mới một user, một roles mới, sau đó cấp quyền mà hệ thống có sẵn và quyền mới tạo cho user đó.  Ngoài ra, chúng tôi sẽ thực hiện chức năng tìm kiếm thông tin liên quan đến users có bao nhiêu roles hay một roles có bao nhiêu user. Từ kết quả tìm kiếm, chúng ta sẽ thực hiện delete  số thông tin bất kỳ của một user hay tước quyền ra khỏi user được chọn lựa trên lưới của kết quả tìm kiếm

Lưu ý:

·         Chi tiết của các bảng trên được mô tả cụ thể như sau

Trong phần tutorial này chúng tôi sẽ chưa một nhóm cách động thành các bước riêng biệt để tạo thuận lợi cho quí vị có thể tiếp cận dễ dàng và có thể thực hiện trong các bài hướng dẫn tiếp theo. Trong phần tutorial này chúng tôi sẽ thực hiện nhóm cách động tương tự các bước trong bài tutorial CMR 1:1 và Hibernate One-One hay One-Many Relationship sử dụng SQLServer

 

Bước 1: Đăng ký Datasource với Netbeans để Netbeans hỗ trợ chúng ta trong việc phát sinh datasource (bước này có thể bỏ qua nếu bạn đã có datasource rồi) (Vui lòng xem chi tiết Bước 1 trong tutorial CMR 1:1)

  • Nếu Datasource với DB mà có chứa các bảng mà chúng ta thao tác đã được đăng ký rồi,
    • Vào trong tab Services, mở rộng phần Database
    • Click phải chuột trên connection mà chúng ta cần làm việc, chọn Connect …

    • Chúng ta nhập username và password để kết nối DB, click OK

Lưu ý: Một Database Connection chỉ dùng cho một DB cụ thể, không thể áp dụng cho tất cả các Database vì mỗi Database Connect có 1 chuỗi kết nối đến một DB cụ thể

 

Bước 2: Tạo Web Application Project tương tự như bài Hibernate One-One relationship kết hợp với SQLServer

1.       Nhập tên project là HibernateManyToMany

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

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

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

Lưu ý: điểm khác biệt khi chọn SQL Server với MySQL đó là Database Dialect không được chọn sẵn, chúng ta phải chọn nội dung này bằng tay trực tiếp trong project

Project được tạo mới như sau

Configure file hibernate.cfg.xml tương tự như bài Hibernate 3.2.5 in MVC Web Application with NetBean 6.9.1 and SQL Server 2005

Mục Configuration Properties

Thêm mới Property Name hibernate.dialect, chọn Property Value phù hợp với SQL Server là org.hibernate.dialect.SQLServerDialect.

Thêm mới Property Name: hibernate.show_sql và Property value: true

Kết quả chúng ta thấy như sau

 

Trong node SessionFactory à Optional Properties à Miscellaneous Properties, click Add.

Chọn Property Name: hibernate.current_session_context_class và Property value: thread.

Click Add và chọn Property Name: hibernate.query.factory_class và Property value: org.hibernate.hql.ast.ASTQueryTranslatorFactory

Lưu lại file và đổi sang mode XML, chúng ta thấy tập tin hibernate.cfg.xml như sau

Tạo file HibernateUtil.java - Helper file tương tự như bài Hibernate kết hợp với SQLServer

Tạo Hibernate Mapping File và POJO tương tự như bài Hibernate kết hợp với SQLServer

·         Tạo Hibernate Reverse Engineering file hibernate.reveng.xml tương tự như bài Hibernate kết hợp với SQLServer nhưng chọn bảng là user_roles (đây là bảng trung gian, nên khi nhấn Add qua thì các bảng users và roles sẽ được add qua theo với bảng user_roles)

·         Tạo Hibernate Mapping File và POJO tương tự như bài Hibernate kết hợp với SQLServer. Thực hiện các thao tác và nhập package là sampe.onemany

Lưu ý: Check vào JDK 5 Language Features.

            Chúng ta có cấu trúc project sau bước này như sau và tập tin hibernate.cfg.xml được cập nhật

Bước 3: Cấu hình quan hệ 1-n tương tự như bài Hibernate One-One relationship kết hợp với SQLServer

  • NetBean hiểu quan hệ giữa 2 table này la Many-to-Many nên code được generate chính xác không cần phải chỉnh sửa như mối quan hệ One-to-One nhưng vẫn phải bổ sung để đảm bảo khi thực hiện thao tác trên các bảng chính thì bảng trung gian sẽ được tương tác thông qua property cascade=”all” trong các tập tin hbm.xml

1.       Tập tin Users.java

2.       File Users.hbm.xml : phần quan hệ many-to-many được thiết lập giá trị xuống bảng trung gian khi cập nhật qua thuộc tính thể hiện qua table=”user_roles”, thuộc tính set thể hiện hệ thống sẽ đồng bộ khi phát sinh hay gọi lệnh set tập collection chứa mối quan hệ giữa các object (cụ thể đây là roleses)

3.       File Roles.java

4.       File Roles.hbm.xml: được cấu hình tương tự như nội dung nêu ở Users như sau

Bước 4: Tạo Data Access Object – DAO để hỗ trợ truy cập các thành phần của Hibernate tương tự khái niệm Session Bean của EJB (nội dung cài đặt tương tự như bài Hibernate One-One relationship kết hợp với SQLServer)

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

2.       Implement class DAO tương tự như bài Hibernate One-One relationship kết hợp với SQLServer như sau:

·         Tạo hàm insert() cho việc insert bảng một và bảng quan hệ nhiều chúng ta tạo 03 methods riêng biệt, một cho Users và một cho Roles, hàm còn lại dùng để tạo mối quan hệ đồng bộ trong việc gán quyền cho Users các Roles bất kỳ mà hệ thống đang có. Việc tạo 03 methods hỗ trợ chúng ta sử dụng riêng biệt vì không nhất thiết khi sử dụng phải insert các bảng cùng một lúc. Các thứ tư thực hiện như sau

                                                              i.      Method insertUser gồm 02 tham số username     và password để insert một user

1.       Chúng ta nên áp dụng transaction để hỗ trợ checking ràng buộc dưới DB để việc insert dữ liệu là toàn vẹn

2.       Tạo mới object của bảng (ở đây là Users)

                                                            ii.      Method insertRoles gồm 1 tham số roleName để tạo một Role mới

1.       Chúng ta nên áp dụng transaction để hỗ trợ checking ràng buộc dưới DB để việc insert dữ liệu là toàn vẹn

2.       Tạo mới object của bảng (ở đây là Roles)

                                                          iii.      Method grantRoleToUser bao gồm 02 tham số username và roleName để gán username cho một roleName hay ngược lại

1.       Tìm kiếm object quan hệ ở bảng Users và bảng Roles, nếu có thì mới gán users cho roles và ngược – đây cũng chính là nguyên nhân, chúng ta áp dụng transaction

2.       Qua việc kích hoạt các hàm add thì cơ chế cascade all với set trong tập tin hbm.xml được kết hoạt để đồng bộ tên cột cụ thể xuống bảng trung gian (Cụ thể ở đây là user_roles)

3.       Thực hiện reference tương tự như khái niệm CMR của EJB và đây là mối quan hệ one – one trên cả 02 phía – bidirectional

4.       Chúng ta không cần gọi phương thức save vì việc cấu hình trong tập tin hbm.xml đã hỗ trợ chúng ta thực hiện cơ chế đồng bộ

·         Tạo hàm searchUsers() để tìm tập các roles của user đó chỉ cần tên của User – ở đây chúng ta sẽ áp dụng câu lệnh truy vấn tương tự bài Hibernate cơ bản áp dụng trên bảng Roles:

·         Tạo hàm searchRoles() để tìm tập các users của một role chỉ cần tên của Role – ở đây chúng ta sẽ áp dụng câu lệnh truy vấn tương tự bài Hibernate cơ bản áp dụng trên bảng Users:

·         Tạo hàm delete để loại bỏ một user ra khỏi một role hay ngược lại

                                                              i.      Tìm role và user, nếu có thực hiện gỡ quan hệ của 02 đối tượng vì đây là quan hệ bidirection thông qua hàm remove

                                                            ii.      Một lần nữa phần cascade trong file cấu hình sẽ kích hoạt hỗ trợ đồng bộ CSDL

Bước 5: Tạo Giao diện để consume ứng dụng đã được thực hiện ở các bước trước

1.       Import thư viện JSTL 1.1 vào project để giao diện sử dụng JSTL để trình bày

2.       Tạo menu – menu.jsp có 02 link cho phép tạo mới user và tìm kiếm user mới.

·         Chỉnh sửa web.xml để tập tin này chạy đầu tiên khi ứng dụng khởi động

3.       Tạo giao diện để thực hiện insert dữ liệu xuống DB – chỉnh sửa trang index.jsp

·         Cập nhật Controller cho việc insert, khi insert xong quay trở lại menu page

·         Thực hiện build, deploy và testing ứng dụng như sau

                                                              i.      DB trước khi insert

                                                            ii.      Thực hiện insert dữ liệu

                                                          iii.      DB sau khi insert

4.       Tạo giao diện để thực hiện việc search dưới DB – tập tin search.jsp

·         Cập nhật Controller cho việc xử lý search

·         Tạo trang show.jsp để trình bày kết quả

Lưu ý: giá trị lấy các hàng sử dụng EL và JSTL áp dụng như khái niện EJB, các giá trị sau thuộc tính rows là các attribute có tồn tại hàm cài đặt get tương ứng trong các class của Hibernate. Khi truy cập không cần dùng hàm get mà dùng dấu chấm “.”

·         Build and Clean, Deploy và Test gõ giá trị search là a

Cấu trúc của Project được cập nhật như sau

5.       Thực hiện chức năng delete cho ứng dụng

·         Cập nhật trang show.jsp bổ sung nút Delete

·         Cập nhật Controller thực hiện xử lý delete

·         Clean and Build, Deploy và Test đến chỗ search

Nhấn Delete sẽ xóa hàng trong bảng user_roles của role đang chọn và DB được cập nhật, trang web refresh

 

Nhấn Delete sẽ xóa hàng trong bảng user_roles của user đang chọn và DB được cập nhật, trang web refresh

 

 

Chúc mừng các bạn đã hoàn tất việc cấu hình và sử dụng các chức năng sử dụng Hibernate để thực hiện đồng bộ dữ liệu giữa 02 đối tượng có quan hệ nhiều nhiều n-n trên CSDL SQL Server 2005 sử dụng tập tin cấu hình

 

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

 

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

Đăng nhận xét