Học Liferay qua ví dụ: Tạo Service Builder

Học Liferay qua ví dụ: Tạo  Service Builder

Ví dụ sau sẽ hướng dẫn cách định nghĩa Service cho 2 table có tên như sau: sample_category và
sample_product.
Bước 1: Định nghĩa service (service.xml)
Tại folder /docroot/WEB_INF, tạo file service.xml với nội dung như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.1.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_1_0.dtd">
<service-builder package-path="vn.softech.web.dng67">
       <author>Admin</author>
       <namespace>sample</namespace>
       <entity name="Product" table="sample_product" local-service="true" remote-service="false">
              <column name="id_product" type="long" primary="true" />
              <column name="id_category" type="long" />
              <column name="product_name" type="String" />
              <column name="description" type="String" />
       </entity>
       <entity name="Category" table="sample_category" local-service="true" remote-service="false">
              <column name="id_category" type="long" primary="true" />
              <column name="category_name" type="String" />
              <column name="productsByCategory" type="Collection" entity="Product" mapping-key="id_category" />
              <finder name="CategoryName" return-type="Collection">
              <finder-column name="category_name" />
              </finder>
       </entity>
</service-builder>

Giải thích:
Line 4: Tag <service-builder package-path="vn.softech.web.dng67"> bao toàn bộ document. Giá trị
com.phuvn.lpsample chính là package mà các file java được tạo ra.
Line 6: Tag <namespace>sample</namespace> là namespace. Giá trị này sẽ kết hợp với entity
name để tạo thành table name trong DB theo kiểu: <namespace>_<entity name>.
Lines 7 – 12: Định nghĩa entity Product gồm 4 thuộc tính là id_product, id_category, product_name và description. Thuộc tính remote-service="false"có nghĩa là không tạo service cho truy xuất từ xa.
Entity Product sẽ map với table sample_product trong DB với field id_product là khóa chính.
Lines 14 – 21: Đính nghĩa entity Category gồm 2 thuộc tính là id_category, category_name. Trong
đó, id_category là khóa chính.
Line 17 sẽ định nghĩa tham chiếu từ Category bằng khóa chính id_category đến entity Product theo khóa phụ là Product.id_category.

Với định nghĩa này thì service-builder tạo ra method CategoryPersistenceImpl.getProducts(long pk) cho phép lấy danh sách product theo id_category.

Lines 18 – 20, định nghĩa method
CategoryPersistenceImpl.findByCategoryName để search Category theo category_name.
Bước 2: Tạo java class bằng công cụ ant build-service
C1:Kích chuột phải vào project – Chọn Liferay—SDK—build service
C2: Sử dụng công cụ Ant
Đến đây thì việc tạo class đã hoàn tất, công việc còn lại là sử dụng nó để xây dựng portlet

Bước 3: Sử dụng service
Tool service-builder sẽ tạo ra các loại class chính sau: model class, persistance class và service
class.
– Model class là các class thể hiển các entity.
– Persistance class là class đóng vai trò tương tác với database.
– Service class là các class đóng vai trò là trung gian giữa portlet và persistence. Service thì có
2 loại đó là local service và remote service.
Service-builder phân chia code thành 2 tầng riêng biệt đó là: interface và implementation. Phần
interface được lưu tại thư mục service trong WEB-INF, phần này sẽ được đóng gói thành file jar và
copy vào thư mục lib của project khi thực hiện lệnh ant build-service. Lưu ý không sửa phần này.
Implementation thì lưu vào thư mục src của project. Developer có thể thay đổi phần này.



Service-builder sẽ tạo class với đầy đủ các chức năng cơ bản để tương tác DB bao gồm: add, update, delete, findAll, findByPrimaryKey.

Ở portlet phải gọi service thông qua các class Util của nó (ví dụ: ProductLocalServiceUtil). Chi tiết về cách sử dụng service thì xem chí tiết trong ví dụ Tạo MVCPortlet của bài sau .

Service-builder sẽ tạo class với đầy đủ các chức năng cơ bản để tương tác DB bao
gồm: add, update, delete, findAll, findByPrimaryKey.
Sau đây là kết quả tạo ra khi thực hiện ví dụ trên:
Phần interface:


Phần implementation (thư mục src)

1 comment:


  1. Cho minhf hỏi về dòng này... Sao mình ko có thuộc tính mapping-key.. Chỉ có mapping-table thôi???

    ReplyDelete