CMR many: many – Quan hệ n:m giữa 02 object trong EJB 2.1
Mục đích của chủ đề này hướng dẫn cách thức cài đặt mô hình CMR trên quan hệ n:m giữa 2 Entity Bean trong EJB 2.1
Yêu cầu
- Nắm vững các khái niệm về CMP và cách thức vận dụng CMP
- Nắm vững khái niệm về CMR
- Nắm vững cách thức cài đặt CMR 1:1 và 1:n (#EJB #EJB2 #CMR)
- Nắm vững cú pháp và kiến thức về OOP, đặc biệt EJB QL
- Tools sử dụng ở đây là Netbeans 6.9.1
- JDK 6 update 22
- Server: JBoss 4.2.3 GA
- DBMS: 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. 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
- 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ẽ thực hiện nhóm cách động tương tự các bước trong bài tutorial CMR 1:1 và 1:n để các bạn tiện theo dõi và nắm vững cách thức triển đồng nhất trên một công nghệ
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 Enterprise Application Project tương tự như bước 2 của tutorial trong CMR 1:1
- Tạo Project Enterprise Application có tên Day4CMP1008
- Chúng ta chọn Server là JBoss4.2.3 GA và version của Java EE là J2EE 1.4 bởi vì chúng ta đang tạo trên nền EJB 2.1
- Chúng ta sẽ có project trên NetBeans như sau
Bước 3: Tạo Entity Bean bao gồm CMP và CMR tương tự như bước 3 của tutorial trong CMR 1:n
- Tạo CMP và CMR
- Tạo Datasource có tên là CMRm_nDS, tập tin jboss-ds.xml tại Server Resource sẽ được cập nhật như hình bên dưới
- Tạo CMP và CMR
- Sau khi các bảng được lấy về, chúng ta chọn bảng trung gian (ở đây là bảng user_roles) và nhấn nút Add >
- Tự động bảng users, roles và bảng user_roles được add qua, bảng cha sẽ bị mờ đi (ở đây là users và roles)
- Chúng ta click nút Next
- Đặt tên package cho code của chúng ta trong ô Package (ở đây tôi nhập sample.cmr)
- Chúng ta nhấn nút Finish để hoàn tất quá trình tạo bean
- Netbeans phát sinh và cập nhật project chúng ta với 02 bean được tạo ra như sau
- Lưu ý: code phát sinh luôn luôn là abstract và container sẽ phát sinh code tương ứng khi chạy và deploy
- Ở Users và Roles, Netbeans phát sinh 1 cặp methods là get/set Collection để chứa tập collection các phần tử của bản quan hệ
- Bảng user_roles không được phát sinh
- Netbeans cũng phát sinh tương ứng việc mapping thông qua tập tin ejb-jar.xml như sau
- Kết thúc bước này chúng ta đã tạo được bean và mapping được cmr nhưng chúng ta vẫn chưa sử dụng được chúng
Bước 4: Cấu hình thông tin để sử dụng và mapping bean, áp dụng tương tự như tutorial CMR 1:1
- Mapping bean để khi deploy server có thể quản lý và đưa ra tên để chúng ta kết nối tới khi sử dụng trong tập tin jboss.xml như hình vẽ bên dưới
- Lưu ý
- Tên tag ejb-name phải được mapping và copy từ tập tin ejb-jar.xml
- Tên jndi là do chúng ta đặt, tên này chúng ta sẽ dùng truy cập bean
- Ở đây chúng ta dùng tag local-jndi-name vì các cmp và cmr chỉ dùng cục bộ và code chúng ta phát sinh chỉ có Local và Local Home Interface
- Chúng ta hoàn tất xong việc mapping bean
- Chúng ta thực hiện mapping DB và đồng bộ giữa instance object và DB thông qua tập tin jbosscmp-jdbc.xml. Nội dung tập tin jbosscmp-jdbc.xml cụ thể như sau
- Lưu ý: tên field-name trong key field là tên thuộc tính của instance bean Users và Roles, tên column-name chính là tên cột làm khóa ngoại dưới DB (ở đây là user_roles với 02 key field được reference từ 02 bảng hay 02 instance), điều này có nghĩa là khi thực hiện insert chúng ta không cần insert khóa ngoại mà khóa ngoại sẽ được container đồng bộ giữa 02 bean quan hệ hay giữa 02 bảng quan hệ. CMR được kích hoạt khi người sử dụng gọi hàm set collection tương ứng của bean
- Kết thúc bước này chúng ta hoàn tất được jbosscmp-jdbc.xml. Lưu ý:nếu không có tập tin này thì không tồn tai, chương trình vẫn chạy bình thường nhưng sẽ không đồng bộ dữ liệu xuống DB, DB sẽ không có tác động gì trong quá trình thao tác
- Kết thúc bước này chúng ta hoàn tất việc cấu hình cho bean
Bước 5: Tạo phương thức insert dữ liệu mới xuống DB và bean – áp dụng tương tự các phương thức phát sinh code do tools Netbeans hỗ trợ như bước 5 trong tutorial CMR 1:1
- Vào trong tập tin Users.java, chúng ta cần tạo hàm insert, nghĩa là phương thức Create Method
- Hàm phát sinh ra bao gồm 02 hàm ejbCreate và ejbPostCreate, và viết code như hình bên dưới
- Ở bảng Roles, chúng ta chỉ cần bổ sung code cho hàm ejbCreate như sau (bean này chỉ có duy nhất 1 tham số, do vậy không cần tạo mới phương thức)
- Kết thúc bước này chúng ta đã hoàn tất xong chức năng insert cho bean
Bước 6: Tạo giao diện web để sử dụng chức năng insert
- Chúng ta chuyển sang gói Day6CMRm_n-war, chỉnh sửa giao diện tập tin index.jsp như sau
- Phát sinh Controller để sử dụng như sau
- Thực hiện Build Project, Start Server, Deploy để testing thư
- Deploy đến Server: deploy tập tin
jboss-ds.xml tại thư mục
<Thư mục lưu trữ project>\Day6CMRm_n\Day6CMRm_n-ejb\setup\đến JBOSS_HOME\server\default\deploy. Chúng ta thấy server có kết quả y như tên chúng ta điền vào datasource jbosscmp-jdbc.xml
- Deploy tập tin ear vào trong thư mục deploy như trên, ta thấy trên server
- Thực hiện testing, chọn tab Services, chọn Servers, chọn Enterprise Application, chọn tên Project, chọn tên project gói war
- Click chuột phải, chọn, Open in Browser
- Kết quả testing demo như sau
- DB trước khi Insert
- Kết quả nhập liệu testing
- Chúng ta đã hoàn tất được chức năng insert
Bước 7: Bổ sung chức năng Search để
- Tìm kiếm tất cả các Roles của một Users
- Tìm kiếm tất cả Users của mộ Roles
- Chúng ta tạo giao diện để xử lý như sau
- Tạo tập tin jsp có dạng như sau
- Cập nhật Controller như sau
- Tạo trang show.jsp để trình bày dữ liệu như sau
- Lưu ý: import thư viện JSTL 1.1 vào Library của project
- Lưu ý:
- Report Search đang được thực hiện theo dạng Master – Child
- Giá trị điền trong EL language ${rows.<tên cmr field>} (ví dụ ${rows.rolesCollection} hay ${rows.usersCollection}) đây là cmr field giúp chúng ta lấy một tập hợp bean chứa phần tử của các bean quan hệ, để từ đó chúng ta có thể khai thác nó trong phần bảng tiếp theo
- Giá trị điền trong EL language ${rows.<tên cmp field>} (ví dụ ${rows1.userName}) đây là field chúng ta lấy từ các khai báo tag "cmp field" khai báo trong tập tin ejb-jar.xml và nó được tạo ra các get/set method trong tập tin Local Interface của các bean
- Clean and Build, Deploy lại và Testting
- Chúng ta đã hoàn tất xong chức năng Search
Chúc mừng các bạn, chúng ta đã hoàn tất xong mối quan hệ giữa object trên mối quan hệ n:m. Rất mong bài viết sẽ giúp ích cho bạn trong việc sử dụng và làm quen đến các khái niệm của EJB 2.1, đặc biệt ở đây là CMR
Rất mong sự góp ý chân thành của các bạn và hẹn các bạn trong bài tiếp theo đó là loạt chủ đề mối quan hệ áp dụng trên EJB 3.0
Không có nhận xét nào:
Đăng nhận xét