Chủ Nhật, 7 tháng 8, 2016

CMR – Container Managed Bean 1:n trong EJB 3.0

CMP – Container Managed Persistent Bean trong EJB 2

CMR – Container Managed Bean 1:n trong EJB 3.0

Mục đích: nội dung của chủ đề này giúp chúng ta làm quen và nắm bắt các khái niệm về cài đặt mối quan hệ 1 : n sử dụng EJB 3.0

Yêu cầu

 

Trong phần nội dung này chúng tôi sẽ làm ví dụ mô trên mối quan hệ một người làm công – employee có nhiều địa chỉ – address và một address chỉ có thuộc duy nhất một employee tương tự như bài CMR 1:n trong EJB 2.1 để giúp chúng ta có thể thấy được sự khác biệt trong cơ chế và cách cài đặt giữa CMR trong EJB 2.1 và EJB 3.0. Dữ liệu mô tả như sau

Lưu ý: Ở phần này trong bảng cài đặt chúng ta sẽ không cho khóa ngoại (Foreign Key) được phép null, đây lả điểm khác biệt mà EJB 3.0 đã khắc phục được so với EJB 2.1

Ở 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 thông tin 1 employee và thực hiện tìm kiếm thông tin liên quan đến employee khi biết một ký tự bất kỳ trong phần tên của employee – Name

Lưu ý:

  • Kéo khóa chinh từ bảng tblEmp sang bảng tblEmpAddr
  • 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 EntityBean, CMR 1:1 trong EJB 3.0 và CMR 1:1 trên EJB 2.1

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  Day8EJB3CMR1_n
    • Chúng ta chọn Server là JBoss5.1.0 GA và version của Java EE là JavaEE5 bởi vì chúng ta đang tạo trên nền EJB 3.0
      • Lưu ý: Server JBoss 5.1.0 GA phải được add vào trong tab Services của Netbeans 6.9.1

    • Chúng ta sẽ có project trên NetBeans như sau

Bước 3: Tạo Entity Class như sau

  • Tạo Entity Class tương tự như tutorial của bài Entity Bean trên EJB 3.0
    • Chúng ta tạo Datasource tương tự như tutorial của bài Entity Bean trên EJB 3.0 và ở đây chúng ta đặt tên Datasource là CMR1_nEJB3, tập tin jboss-ds.xml tại Server Resource sẽ được cập nhật như hình bên dưới

    • Sau khi các bảng được lấy về, chúng ta chọn bảng cần phát sinh Entity Class và Relationship (ở đây là bảng tblEmpAddr) và nhấn nút Add >, Netbeans tự động đem cả bảng tblEmp theo

    • Chúng ta click nút Next

    • Thành phần Entity Classes sẽ khác hoàn toàn so với EJB 2.1, ở đây phát sinh class sẽ phải dùng toán tử new khi sử dụng như Java Object bình thường
    • Chúng ta nhấn Next

    • Ở đây chúng ta sẽ chọn Collection Type có thể là Collection hay Set hay List, nhưng ở đây chúng tôi chọn loại Collection để tương thích với cách phát sinh của EJB 2.1
    • Bên cạnh đó, chúng ta phải check vào “Fully Qualified Database Table Names” và “Attributes for Regenerating Tables” để tool Netbean hỗ trợ chúng ta phát sinh code (các thuộc tính của entity class và một số query object cơ bản)
    • Chúng ta nhấn nút Finish để hoàn tất quá trình tạo bean (các bước trên tương tự như tutorial Entity Bean trên EJB 3.0)
    • Netbeans phát sinh và cập nhật project chúng ta với 01 java class được tạo ra như sau (không có bất kỳ interface nào cả)
      • Lưu ý: code phát sinh luôn luôn chứa đựng annotation thay cho việc mapping trực tiếp vào tập tin ejb-jar.xml như EJB 2.1 và container sẽ phát sinh code tương ứng khi chạy và deploy

      • Lưu ý:
        • Constructor của các java class có thể phát sinh số lượng tham số khác nhau tùy theo cách cài đặt bảng của chúng ta trên từng field là có cho phép null hay không (Allowed Null)
        • Giá trị cascade = CascadeType.ALL thể hiện việc thực hiện đồng bộ quan hệ giữa bảng cha và bảng con, khi thực hiện cập nhật bảng con vào bảng cha thì container sẽ đồng bộ mối quan hệ giữa con và cha thông qua khóa ngoại
        • Nếu như bạn quên gán khóa ngoại khác null bên bảng con thì code phát sinh sẽ mất giá trị CascadeType.All và khi đồng bộ dữ liệu thì khóa ngoại sẽ không được insert xuống DB. Do vậy, trong trường hợp này bạn chỉ cần bộ sung nội dung cascade = CascadeType.ALL như hình vẽ bên trên

      • Lưu ý: nếu java object có annotation là join column thì đó là class phát sinh cho lớp con trong mối quan hệ
    • Kết thúc bước này chúng ta đã tạo được bean và mapping nhưng chúng ta vẫn chưa sử dụng được chúng

Bước 4: Tạo Session Bean để đưa ra bên ngoài cho client sử dụng tương tự như tutorial Entity Bean trên EJB 3

  • Tạo session bean trên Day8EJB3CMR1_n-ejb, đặt tên bean OneToManyBean, chọn package y như entity class ở trên (sample.cmr1n), ở EJB3 thì session bean được phát sinh giống như là EJB 2.1, ngoại trừ không tồn tại Home Interface (Lưu ý nhớ chọn luôn cả phần Remote)

  • Chúng ta thực hiện tạo các phương thức hàm để sử dụng các thành phần Entity Classes và đưa một số chức năng cho người sử dụng qua Session Bean interface
    • Chúng ta thực hiện đưa Entity Manager vào để Session Bean có thể kết nối với Entity Class tương tự như tutorial Entity Bean trên EJB 3
  • Phát sinh hàm Business Method có tên là  insert để thực hiện insert dữ liệu xuống 02 bảng quan hệ trong DB
  • Code của hàm insert trong bean, local và remote interface được cập nhật như sau
    • Lưu ý :
      • Chúng ta thực hiện insert trên từng bảng riêng biệt, do vậy chúng ta sẽ có 02 hàm insert, một dành cho bảng cha, một dành cho bảng con
      • Khi thực hiện persist, chúng ta chỉ cần thực hiện persist bảng cha, giá trị bảng con kích hoạt sẽ được cập nhật thông qua hàm set (hay add) của cha được gọi (cụ thể ở đây là emp.getTblEmpAddrCollection().add(addr);
      • Sau khi add kích hoạt thì giá trị của khóa ngoại bảng con được cập nhật,chúng ta sẽ không bao giờ cập nhật giá trị cho field làm khóa ngoại một cách trực tiếp

Bước 5: 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 chính là tên tập tin Session Bean class (cụ thể OneToManyBean – tên class OneToManyBean.java)
    • 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 lẫn jndi-name vì các cmp được phát sinh chỉ có Local và Remote Interface
  • Chúng ta hoàn tất xong việc mapping bean
  • Chúng ta không thực hiện mapping DB và đồng bộ giữa instance object và DB thông qua tập tin jbosscmp-jdbc.xml vì tất cả các khai báo trong Entity class đã được khai báo thông qua annotation trong Entity class (chúng ta đã thấy code và annotation phát sinh trong tập tin
  • 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 6: Tạo giao diện web để sử dụng chức năng insert

  • Chúng ta chuyển sang gói Day8EJB3CMR1_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>\ Day8EJB3CMR1_n\ Day8EJB3CMR1_n-ejb\setup\đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 5.1.0 GA). Chúng ta thấy server có kết quả y như tên chúng ta thấy trong tập tin persistence.xml

    • Deploy tập tin ear vào trong thư mục deploy như trên, ta thấy trên server

      • Lưu ý:
        • Cách deploy của EJB 3.0 này nhiều hơn so với EJB 2.1 và Hibernate sẽ phải deploy tất các các thành phần liên quan đến query và các thành phần của Entity Class, do vậy, việc deploy hơn chậm một chút. Tới khi nào chúng ta thấy được hình như trên là việc deploy thành công
        • Chúng ta cứ chờ cho việc deploy hoàn tất, không nên vội vã, bất cứ hành động nhanh nhẩu nào sẽ gây lỗi cho code phát sinh
    • Thực hiện testing, chọn tab Services, chọn Servers, chọn Web Application, chọn tên Project có gói war
      • Trong EJB 3 và Server JBoss 5.1.0 GA, server đã tách biệt gói jar và gói war, và không thể hiện gói jar trong EJB Module lẫn Enterprise Application
    • 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 employee khi biết một ký tự trong name được người dùng nhập vào trên form

  • Cập nhật hàm Search trong Session bean như sau (phát sinh theo cách phát sinh một phương thức cho người dùng – Business method)

      • Lưu ý:
        • Chúng ta sử dụng Entity Manager để hỗ trợ tìm kiếm qua việc xây dựng các query mới nhằm giảm tải trong lúc server – container thực hiện deploy
    • Đồng thời Netbeans cũng cập nhật Local và Remote Interface như sau

  • 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

      • Lưu ý: việc lấy tập dữ liệu gồm thông tin của 02 bean, chúng ta nên áp dụng transaction để đảm bảo mối liên thông giữa 02 object có quan hệ trên server - container
    • 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 ý:
        • Giá trị điền trong EL language ${rows.<tên thuộc tính trong entity Class>} (ví dụ ${rows.addrName}) đây là field chúng ta lấy từ các thuộc tính có trong entity class và nó được tạo ra các get/set method trong tập tin entity class (ở đây là tập tin TblEmp.java và TblEmpAddr.java)
        • Giá trị của các field trong bảng quan hệ được lấy qua bảng chính dạng ${rows.<tên cmr quan hệ>}. (ví dụ ở đây là ${user.tblEmpAddrCollection})
    • Clean and Build, Deploy lại và Testting

    • Chúng ta đã hoàn tất xong chức năng Search
  • Các chức năng còn lại về Delete, Update, các bạn có thể tự làm tương tự như tutotial EntityBean trên EJB 3.0

Chúc mừng các bạn, chúng ta đã hoàn tất xong việc cài đặt CMR 1:n trên EJB 3.0 (bạn phải nắm bắt được khái niệm trong bài khái niệm Entity Bean, CMR 1:1 trong mô hình EJB 2.1). 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 3.0, đặc biệt ở đây là CMR giữa các Entity Class

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à vận dụng CMR n:m trên EJB 3.0

 

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

Đăng nhận xét