Thứ Ba, 9 tháng 8, 2016

Transaction trong EJB 3.0 – cài đặt và vận dụng các khái niệm transaction trên EJB 3.0

CMP – Container Managed Persistent Bean trong EJB 2

Transaction trong EJB 3.0 – cài đặt và vận dụng các khái niệm transaction trên EJB 3.0

Mục đích: nội dung của chủ đề này tiếp tục mở rộng nội dung cài đặt và vận dụng các khái niệm transaction trên để thấy sự khác biệt giữa mô hình cài đặt transaction 2.1 với mô hình transaction trên EJB 3.0

Transaction trong EJB 3.0 – cài đặt và vận dụng các khái niệm transaction trên EJB 3.0

Mục đích: nội dung của chủ đề này tiếp tục mở rộng nội dung cài đặt và vận dụng các khái niệm transaction trên để thấy sự khác biệt giữa mô hình cài đặt transaction 2.1 với mô hình transaction trên EJB 3.0

Yêu cầu

  • Nắm vững các khái niệm về EJB 2.1 và các nguyên lý cơ bản về cài đặt các đối tượng trong EJB 2.1
  • Nắm vững các khái niệm transaction và cách cài đặt transaction trên EJB 2.1 (https://www.facebook.com/TrongKhanh.Kieu/posts/274640269575353)
  • Nắm vững cú pháp và kiến thức về OOP
  • Tools sử dụng ở đây là Netbeans 6.9.1
  • JDK 6 update 22
  • Server: JBoss 5.1.0 GA
  • DBMS: SQL Server 2005

Tổng quát hóa

  • Khái niệm transaction không thay đổi cho dù áp dụng công nghệ hay framework nào cũng được.
  • Ở đây chúng tôi giới thiệu việc cài đặt transaction trên EJB 3.0 để cho các bạn thấy được cú pháp cài đặt và vận dụng đơn giản khi chúng ta sử dụng EJB 3.0 nhưng vấn đề này chỉ có hiệu quả khi bạn đã nắm được việc cài đặt EJB 2.1 và các lý thuyết tương ứng về transaction
  • Sự khác biệt của EJB 3.0 và EJB 2.1 chỉ là EJB 3.0 giúp đơn giản việc cấu hình thông qua các annotation trong khi EJB 2.1 là các tập tin XML

Ứng dụng EJB áp dụng transaction trên Session Bean cụ thể

  • Đầu tiên chúng tôi sẽ làm ví dụ mô tả chương trình ứng dụng sử dụng stateful bean có sử dụng transaction xử lý việc mua hàng và xuất kết quả của quá trình giao dịch mua hàng. Trong đó, người sử dụng có thể hoàn tất hay hủy mua hàng (ví dụ này tương tự như bài Transaction trong EJB 2.1)
  • Trong phần tutorial này chúng tôi sẽ thực hiện một nhóm cách động tương tự các bước trong bài tutorial CMR 1:1 trong EJB 2.1, Transaction trong EJB 2.1, Entity Bean trong EJB 3.0
  • Bước 1: 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  EJB3Transaction
    • Chúng ta chọn Server là JBoss 5.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
    • Chúng ta sẽ có project trên NetBeans như sau

  • Bước 2: Tạo Stateful Session Bean (thực hiện tương tự như bài Transaction trong EJB 2.1)
    • Đặt tên bean (TransactionSessionBean), gõ tên package (sample.trans), chọn Stateful, chọn cả Remote và Local.
    • Nhấn nút Finish, project được phát sinh như sau

  • Bước 3: phát sinh interface hỗ trợ transaction và một số business method cho EJB (thực hiện tương tự như bài Transaction trong EJB 2.1)
    • Bổ sung thêm phần implementations SessionSynchronization vào trong phần khai báo của class bean để hiện thực các phương thức callback để container có thể truy cập và hỗ trợ transaction khi bean được thực thi
    • Nhấn chuột trái trên bóng đèn để phát sinh các phương thức abstract method, chọn Implement all abstract methods. Khi click chuột chương trình sẽ phát sinh 3 hàm tương ứng là afterBegin, beforeCompletion, và afterCompletion
    • Để bổ sung việc cập nhật giá trị và tính toán tổng giá trị chúng ta cần khai báo các thuộc tính sau
      • total: giá trị tổng cuối cùng sau khi việc mua hoàn tất – transaction hoàn tất
      • newTotal: giá trị tổng cập nhật mới tạm thời, giá trị này sẽ cập nhật cho total khi transaction hoàn tất, ngược lại giá trị total vẫn giữ nguyên như cũ

    • Phát sinh hàm business method có tên buy trong bean class (thực hiện tương tự như bài Transaction trong EJB 2.1)
      • Phát sinh phương thức buy (tăng tiền lên sau mỗi lần mua) với tham số price và phát sinh cả 02 interface remote lẫn local (Both) như sau

        • Lưu ý:
          • Để yêu cầu container hỗ trợ transaction khi phương thức này đươc gọi, chúng ta phải khai báo annotation với 1 trong những thuộc tính xác định transaction hỗ trợ
          • Cú pháp: @TransactionAttribute(TransactionAttributeType.THUOCTINH)
          • Tất cả các gói import là của javax.ejb
      • Tương tự phát sinh tiếp business method int getTotal() và cập nhật thân hàm của hàm getTotal như sau

    • Cập nhật giá trị của các hàm callback method hỗ trợ transaction như sau

    • Khi hoàn tất các bước trên, chúng ta thấy các thành phần interface của Remote và Local được cập nhật như sau

  • 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

    • Lưu ý
      • Tên tag ejb-name là tên của Session Bean class (cụ thể TransactionSessionBean)
      • 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 được phát sinh chỉ có Local và Local Home Interface
    • Chúng ta hoàn tất xong việc mapping bean
    • Kết thúc bước này chúng ta hoàn tất việc cấu hình cho bean và chúng ta tiến tới sử dụng bean trong ứng dụng web
  • Bước 5: Tạo giao diện web để sử dụng các chức năng kết hợp transaction như sau
    • Chúng tôi mô tả 3 lần giao dịch mua hàng, 02 lần đầu sẽ commit – chấp nhận mua, lần cuối cùng chúng tôi sẽ rollback – hủy lần mua cuối cùng
    • Kết quả mong đợi tổng tiền của chúng ta là tổng của 02 lần đâu tiên, lần cuối cùng sẽ không cập nhật giá trị vào tổng chung
    • Chúng ta chuyển sang gói EJB3Transaction-war, chỉnh sửa giao diện tập tin index.jsp như sau

    • Phát sinh Controller để sử dụng như sau

      • Chúng ta sử dụng UserTransaction để có thể điều khiển việc bắt đầu và kết thúc transaction, còn việc thực hiện transaction sẽ do container thực hiện
      • Cấu trúc ứng dụng web và project được cập nhật như sau

  • Bước 6: Thực hiện Build Project, Start Server, Deploy để testing thư
    • Deploy tập tin ear vào trong thư mục đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 5.1.0 GA), ta thấy trên server

      • Lưu ý:
        • 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 tương tự như tutorial EntityBean trong EJB 3.0
      • Click chuột phải trên thành phần gói war trong gói ứng dụng của Web Applications, chọn Open in Browser

      • Kết quả nhập liệu testing

  • Chúng ta đã hoàn tất được ứng dụng có hỗ trợ transaction từ container thông qua các tham số khai báo của chúng ta qua các annotation hỗ trợ transaction trực tiếp trên Bean

Ứng dụng EJB áp dụng transaction trên ví dụ cụ thể dùng entity bean, cụ thể là cmp

  • Tiếp theo, chúng tôi sẽ làm ví dụ mô tả chương trình ứng dụng sử dụng cmp có sử dụng transaction xử lý việc cập nhật các giá trị một field trong DB sử dụng transaction hỗ trợ của container để cho thấy việc khác biệt của session bean và entity bean trong mô hình ứng dụng EJB 3.0, đồng thời thấy sự khác biệt trên mô hình 2.1 và 3.0 (các ví dụ được thực hiện tương tự như bài Transaction trong EJB 2.1 nhưng có sự khác biệt về cách cài đặt và ứng dụng).
  • Trong phần tutorial này chúng tôi sẽ thực hiện một nhóm cách động tương tự các bước trong bài tutorial CMR 1:1, Entity Bean trong EJB 3.0, Transaction trong EJB 2.1
  • Chúng tôi sẽ thực hiện với DB có cấu trúc như sau

  • 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 EntityBean của EJB 3.0
      • Tạo Project Enterprise Application có tên  EJB3EntityTrans
      • Chúng ta chọn Server là JBoss 5.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
      • Chúng ta sẽ có project trên NetBeans như sau

  • Bước 3: Tạo Entity Bean các bước của tutorial trong EntityBean của EJB 3.0
    • 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à TransEJB3, 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 (ở đây là bảng tblAccount) và nhấn nút Add >

      • 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

      • 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 – stateful trên EJB3EntityTrans-ejb, đặt tên bean TransSessionBean, chọn package y như entity class ở trên (sample.trans), ở 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

    • Vì cách sử dụng đối tượng enity bean trong EJB 3 khác hoàn toàn so với EJB 2.1, đó là chúng ta đang sử dụng theo mô hình dạng mọi thứ muốn sử dụng Entity Bean không được kết nối trực tiếp mà phải thông qua session bean. Do vậy, chúng ta sẽ áp dụng trực tiếp session trong bean và che đi sự phức tạp về bean và transaction đối với người dủng (tương tự cách che của Home method trong EJB 2.x)
    • Chúng ta phát sinh Business method để hỗ trợ deposit, withdrawn và lấy giá trị balance của account được đưa vào như sau

    • Remote và Local Interface được cập nhật như sau

  • 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ể TransSessionBean – tên class TransSessionBean.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 EJB3EntityTrans-war, chỉnh sửa giao diện tập tin index.jsp như sau

    • Cập nhật Controller – Servlet với package sample.web xử lý như sau

      • Phần import gồm những nội dung như sau

    • Sau khi insert thành công chúng ta sẽ chuyển sang trang process.jsp để cập nhật giá trị balance của account trong DB và áp dụng transaction để hiệu lực giá trị của nó
      • Trang này sẽ trình bày thông tin liên quan account và số dư còn lại
      • Trang cho phép người ta cập nhật giá trị sô dư của account

    • Cập nhật giá trị xử lý transaction trên Controller
      • Kết quả xử lý sẽ chuyển lại trang process.jsp để cập nhật giá trị
      • Lưu ý trong trang phải sử dụng transaction để người dùng điều khiền transaction

    • Bước 7: 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>\ EJB3EntityTrans\ EJB3EntityTrans-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 đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 5.1.0 GA), 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 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

      • Nhập giá trị vào ô số, và nhấn Deposit

      • Nhập giá trị nhỏ hơn 50 để deposit

      • Withdrawn 20

      • Withdrawn số tiền lớn hơn 90

Chúng ta đã hoàn tất được các ứng dụng có hỗ trợ transaction từ container thông qua các tham số khai báo của chúng ta trong tập tin deployment descriptor ejb-jar.xml trên cả session bean và entity bean trong mô hình EJB 3.0

Qua các ví dụ trên chúng ta thấy rõ khái niệm về transaction, sự khác nhau về cài đặt và hỗ trợ transaction đối với session bean và entity bean trong mô hình EJB 3.0

Chúc mừng các bạn, chúng ta đã hoàn tất xong việc cài đặt transaction trên các phương thức của EJB. 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 mở rộng và nâng cao của EJB 3.x, đặc biệt ở đây là mở rộng khái niệm về transaction

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 về security trên các ứng dụng EJB 2.1 và EJB 3.0

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

Đăng nhận xét