CMR – Container Managed Relationships trong EJB 2.1


Mục đích của chủ đề này mô tả khái niệm CMR giữa các Entity Bean trong mô hình EJB và qui tắc cài đặt CMR

Chủ đề này đòi hỏi bạn phải nắm vững được khái niệm entity bean, CMP và quan hệ trong CSDL

Định nghĩa

  • CMR cho phép các entity bean liên hệ qua lại với nhau tương tự như relationship được cài đặt trong các công cụ quản lý CSDL quan hệ (DBMS)
  • CMR thể hiện mối quan hệ giữa các đối tượng thông qua các thuộc tính của hai hay nhiều entity bean nhằm đảm bảo toàn vẹn dữ liệu khi thao tác
  • Ngoài ra, CMR được dùng để thao tác, xử lý, cập nhật, tổng hợp dữ liệu trên nhiều entity bean. EJB Container sẽ quản lý quan hệ giữa các thành phần bean
  • CMR được áp dụng trên các entity bean được vận dụng với CMP và CMR thể hiện mối quan hệ giữa các CMP thông qua tập tin mô tả cài đặt – deployment descriptor (ejb-jar.xml)
  • CMR hỗ trợ 3 loại quan hệ
    • one-to-one(1-1): 1 instance bean quan hệ với duy nhất 1 instance bean
      • Ví dụ: Con người và địa chỉ nhà tại một thời điểm
    • one-to-many(1-n): 1 instance bean quan hệ với nhiều instance bean khác có liên quan
      • Ví dụ: Khách hàng và Hóa đơn
    • many-to-many(m-n): nhiều instance bean quan hệ với nhiều instance bean khác
      • Ví dụ: Người sử dụng (User) và Phân quyền sử dụng (Roles)
  • Đặc biệt CMR còn qui định hướng truy xuất dữ liệu trên các thành phần instance bean dựa trên các thành phần quan hệ đã nêu trên
    • Unidirectional: dữ liệu tổng hợp trên một tập hợp instance bean chỉ được xác định theo duy nhất 1 chiều trong quan hệ
      • Ví dụ:
        • Chúng ta có quan hệ giữa Hóa đơn và Khách hàng.
        • Chúng ta phát biểu một Khách hàng sẽ có nhiều Hóa đơn và một Hóa đơn chỉ của một Khách hàng. Do vậy, đây là mối quan hệ 1 – n theo hai object Khách hàng và Hóa đơn
        • Theo qui tắc cài đặt của một số công cụ hỗ trợ cài đặt CSDL, chúng ta thường đặt khóa chính của bảng 1 vào trong bảng nhiều để làm khóa ngoại
        • Ở đây, chúng ta sẽ thấy rằng Hóa đơn sẽ chứa thông tin của Khách hàng (đó là khóa chính của bảng Khách hàng).
        • Câu hỏi đặt ra rằng nếu chúng ta che bảng Hóa đơn và hỏi rằng Khách hàng này có bao nhiêu hóa đơn? Câu trả lời sẽ là không thể truy vấn.
        • Nhưng ngược lại chúng ta che bảng Khách hàng và đặt câu hỏi Hóa đơn của Khách hàng nào? Câu trả lời của chúng ta sẽ lấy được ít nhất thông tin là mã số của Khách hàng
        • Ví dụ trên đã mô tả việc lấy dữ liệu tổng hợp trên mối quan hệ Khách hàng và Hóa đơn thì chúng ta chỉ thể lấy thông tin tổng quát đầy đủ chỉ trên hướng Hóa đơn. Đây chính là dạng truy xuất 1 chiều
    • Bi-directional: dữ liệu tổng hợp trên một tập hợp instance bean được xác định theo cả 2 hướng trong quan hệ
      • Từ ví dụ của Unidirectional, chúng ta muốn truy vấn dữ liệu trên cả 02 chiều thì Bi-directional hướng tới là chúng ta có thể truy cập dữ liệu tổng hợp từ một instance bean bất kỳ trong mối quan hệ
      • Ý tưởng này theo nghĩa bảng Khách hàng phải chứa tập mã số hóa đơn để chúng ta có thể truy vấn thông tin của instance bean còn lại mà không cần phải xác định là phải đứng trên scope của instance bất kỳ
    • Kết hợp với mối quan hệ và định hướng dữ liệu, CMR đưa ra các loại quan hệ cụ thể như sau
      • One-to-one, unidirectional
        • 01 bảng chứa đựng khóa ngoại của bảng khác
        • Chỉ có 01 bean chứa đựng phương thức abstract getter and setter dùng để lấy thông tin của bean khác trong quan hệ
      • One-to-one, bidirectional
        • Cả 02 bảng chứa đựng khóa ngoại của nhau
        • Cả 02 bean chứa đựng phương thức abstract getter and setter dùng để lấy thông tin lẫn nhau trong quan hệ
      • One-to-many, unidirectional
        • Thực hiện lấy thông tin dựa trên một tập khóa ngoại trên bảng quan hệ 1
        • Sử dụng kiểu dữ liệu java.util.Collection or java.util.Set cho việc lưu trữ tập khóa ngoại
      • One-to-many, bidirectional
        • Trên bean quan hệ 1 chứa tập khóa ngoại của bean quan hệ nhiều, bean quan hệ nhiều chỉ chứa duy nhất instance bean của quan hệ 1
        • Sử dụng kiểu dữ liệu java.util.Collection or java.util.Set cho việc lưu trữ tập khóa ngoại
      • Many-to-many, unidirectional
        • Tập khóa ngoại giữa 02 bean chỉ tồn tại trên duy nhất 1 bean
        • Sử dụng bảng liên kết (link table) giữa 02 bean – bảng này sẽ được thể hiện trong deployment descriptor
      • Many-to-many, bidirectional
        • Cả 02 bean đều chứa tập khóa ngoại của đối tượng bean còn lại
        • Sử dụng bảng liên kết (link table) giữa 02 bean – bảng này sẽ được thể hiện trong deployment descriptor
      • Quan hệ many-to-many là dạng kết hợp giữa many-to-one và one-to-many
  • CMR hỗ trợ việc đảm bảo toàn vẹn tham chiếu (Referential Integrity)
    • Đảm bảo mối quan hệ về giữa 02 của đối tượng instance bean không bị phá vỡ khi một entity bean được thêm (insert) hay xóa hay cập nhật tương tự như cách bỏ khóa chính sang bảng nhiều để làm khóa ngoại trong 1 số công cụ quản lý CSDL (DBMS)
    • Cơ chế này được đảm bảo thực hiện bởi EJB Container
  • CMR cũng hỗ trợ việc xóa dữ liệu và instance trên bộ nhớ liên hoàn (cascade Delete and Remove). Vấn đề này hướng tới chúng ta có thể hủy toàn bộ dữ liệu trên các instance object quan hệ
  • Mối quan hệ của các đối tượng trong CMR được thể hiện thông qua “abstract persistence schema”
    • abstract persistence schema chứa các thông tin liên quan đến việc ánh xạ giữa thuộc tính trong instance và cột dữ liệu trong bảng của CSDL
    • abstract persistence scheme có thể được xem là cấu trúc hình dạng tương tự như table và các ràng buộc về quan hệ bên dưới CSDL
    • abstract persistence schema được mô tả trong xml file mô tả thông tin cấu hình ejb-jar.xml
    • Mọi thao tác của EJB container trên các instance bean là thực hiện trên abstract persistent schema, không phải trên table hay ràng buộc cụ thể dưới CSDL
      • Việc thao tác và truy vấn dữ liệu trên bean dựa trên thuộc tính của bean và các tập dữ liệu quan hệ không phải column hay field hay constraint dưới CSDL
      • Các property khi được truy cập phải xác định rõ ràng property của instance bean cụ thể nào theo đúng khái niệm lập trình hướng đối tượng
      • Ngôn ngữ truy vấn cho các đối tượng dựa trên ngôn ngữ OQL – Object Query Language không phải SQL

Qui tắc cài đặt CMR

  • Tất cả các component interface (remote và local interface), home interface (home interface và local home interface) tương tự như CMP
  • Implement trên bean class
    • Xác định field quan hệ trên cả 02 entity bean liên kết
    • Khai báo thêm 02 phương thức abstract get và set của field quan hệ theo qui luật liên kết
      • 1:n – phương thức get và set có kiểu trả về và tham số truyền của đối tượng 1 là kiểu tập hợp: đối tượng n là kiểu component interface của đối tượng 1.
      • n:n – phương thức get và set có kiểu trả về và tham số truyền của cả 02 đối tượng là kiểu tập hợp.
      • 1:1’ – phương thức get và set có kiểu trả về và tham số truyền của đối tượng 1 là component interface của đối tượng 1’ và ngược lại.
  • Thể hiện ràng buộc giữa các entity bean thông qua deployment descriptor
    • ejb-jar.xml

<relationships>

<ejb-relation>

<ejb-relation-name>tên quan hệ</ejb-relation-name>

<ejb-relationship-role>

<ejb-relationship-role-name>tên role</ejb-relationship-role-name>

<multiplicity>One/Many</multiplicity>

<relationship-role-source>

<ejb-name>tên tham chiếu</ejb-name>

</relationship-role-source>

<cmr-field>

<cmr-field-name>tên đối tượng</cmr-field-name>

<cmr-field-type>loại dữ liệu</cmr-field-type>

</cmr-field>

</ejb-relationship-role>

<ejb-relationship-role>

<ejb-relationship-role-name>tênquanhệ1</ejb-relationship-role-name>

<multiplicity>Many/One</multiplicity>

<cascade-delete/>

<relationship-role-source>

<ejb-name>tên tham chiếu</ejb-name>

</relationship-role-source>

<cmr-field>

<cmr-field-name>tên field khóa ngoại</cmr-field-name>

</cmr-field>

</ejb-relationship-role>

</ejb-relation>

</relationships>

jbosscmp-jdbc.xml : bổ sung thêm vào phần relationship descriptor như sau (nội dung này sẽ được thể hiện rõ trong các tutorial tiếp theo chủ đề này)

<relationships>

<ejb-relation>

<ejb-relation-name>tên quan hệ</ejb-relation-name>

<ejb-relationship-role>

<ejb-relationship-role-name>tên quan hệ</ejb-relationship-role-name>

<key-fields>

<key-field>

<field-name>field class làm khóa ngoại</field-name>

<column-name>fieldtablethamchiếukhóangoại</column-name>

</key-field>

</key-fields>

</ejb-relationship-role>

<ejb-relationship-role>

<ejb-relationship-role-name>tên quan hệ</ejb-relationship-role-name>

<key-fields/>

</ejb-relationship-role>

</ejb-relation>

</relationships>

Lưu ý: implement tập tin jbosscmp-jdbc.xml tuân theo qui luật

1:n – xác định element field-name là tên field là khóa chính của đối tượng 1.

n:n – xác định bảng trung gian và áp dụng như đối tượng 1:n

<relation-table-mapping>

<table-name>tên bảng trung gian</table-name>

</relation-table-mapping>

1:1 xác định element field-name tương ứng tên field khóa chính của từng đối tượng

Trên đây là một số nội dung khái niệm cơ bản về CMR.

Advertisements

Phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s