一、什麼是Service Builder?
Service Builder是Liferay IDE(SDK)提供的一種代碼生成方案,開發人員隻需要編輯一個資料庫的實體描述檔案,即可根據本XML檔案生成Spring層代碼、Hibernate層代碼、SQL、SQL索引建立檔案、Spring和hibernate的配置檔案等,可以大提高開發人員的效率。簡單說就是根據資料庫描述檔案,生成service層和持久化層的代碼,開發人員隻需要關注控制層即可。
二、Service Builder的使用
1、首先需要有一個Portlet的插件工程,建立方法,參考http://www.huqiwen.com/2012/09/01/liferay-6-1-development-studey-2-create-portlet-project/
2、打開Liferay IDE,點選工具欄中Liferay工具的中間按鈕,New Liferay Service Builder,彈出的向導如下,填寫相關資訊,點選完成。
Plugin Project:将用于哪個工程,如果有多個工程,請看仔細。
Service file:資料庫描述檔案的檔案名,使用向導不可更改(可以手動改,後面詳述)
Package path:包名路徑,這裡是定義基礎的包名路徑,建議一般規則為:公司域名+portlet+功能子產品名
Namespace:命名空間,如果沒有指定資料庫的表名,則會在前面添加上此命名空間。
Author:作者名,預設讀取系統變量。
Include sample entiry in new file:在自動生成的xml檔案中是否包含示例,如果是新手,建議打勾。
3、編輯service.xml檔案。在liferay IDE裡面提供了service的開視化編輯。簡單介紹一下主要屬性的含義。
Name:執行個體名稱,就是通常的JavaBean的名稱。
Local Service:本地服務,一般選中。
Remote Service:遠端服務,用于為生成Web Service做支援,如果不需要不要選中。
Human Name:人性化名稱。一般留白即可,此處的名字用于生成文檔時使用,如果留白使用Name。
Table:資料庫名稱,如果不填寫,使用Name。
Uuid:是否生成一個uuid的字段,具體的根據資料庫設計情況而定。可以使用也可以不使用。推薦使用。
Uuid accessor:是否使用uuid存取實體,根據情況而定。可以使用也可以不使用。推薦使用。
Persistence Class:持久化類的名稱,推薦留白,讓自動生成。
Data source:資料源,一般留白。。
Session Factory:資料庫會話工廠,一般留白。
TX Manager:事務管理,一般留白。
Cache enabled:開啟緩存,推薦選中。
JSON enabled:開啟JSON,生成的代碼中包含實體的JSON序列化和反序列化,根據情況而定。如果不使用JSON,請不要勾選。
4、在Columns裡面添加字段,填寫字段名稱,類型等。如果要使用特殊的資料庫名稱,或者字段有其他需求,請點開Columns,在下面逐個字段上修改。Db Name對應的為資料庫的字段名稱,其他一般留白即可。
5、Order,查詢結果根據哪個字段排序列。
6、Finders:查詢方法。service builder預設會生成基本的增删改查方法,如果有一些根據字段查詢某些資料,傳回的可以是一個實體也可以是一個List。
<finder name="userId" return-type="user">
<finder-column name="userId" />
</finder>
這個的意思是生成一個方法叫findyByUserId的方法,傳入的參數是userId,傳回的類型是User。(這個例子隻是為說明,一般如果userId是主鍵,service builder生成的方法裡面,不寫此finder,已經包含此方法)
finder-column這裡可以填寫多個參數,return-type,如果是Collection則傳回類型是List。
Finders方法,可以根據實際情況進行填寫,對于使用finders仍不能滿足的方法,後面詳解。
7、點選ant裡面servicer-builder按鈕,等待Liferay進行代碼生成。或者将可視化編輯器切換到Diagram,點選右鍵,service builder。
三、Service Builder生成代碼的使用。
如果是第一次使用Service Builder,請按如下步驟操作。
1、WEB-INF目錄下面找到service目錄,點選右鍵Build Path-->Use as Source Folder。service包裡面主要包括生成的代碼裡面的接口方法,友善我們進行跨工程的代碼調用。src裡面都 實作包。
2、Service Builder的使用,一般有兩種方法。一種是擷取一個Service。
CmsArticleLocalService cmsArticleServie = CmsArticleLocalServiceUtil.getService();
然後使用此xxService調用相關方法
一種是直接使用xxLocalServiceUtil調用相關方法。大部分情況下使用xxLocalServiceUtil進行方法調用。
3、建立一個modle執行個體一般使用如,xxLocalServiceUtil.createXX()方法。
四、自定義方法
雖然liferay自動生成的代碼裡面包含了常用方法,足以應付一般場景,但是有些特殊場景需要一些特殊的方法,如何添加自定義方法呢?
1、找到src下面和此service builder相關的的xxx.service.impl包,找到xxxLocalServiceImpl的檔案,打開在此類裡添加相關的自定義方法。
2、如果是要為modle添加自定義方法,請在xxx.modle.impl包裡面的,xxImpl檔案裡面添加自定義方法。
3、修改完成後,再次執行Service Builder,會将這些方法自動的添加到其他相關接口、類裡面。Liferay的Service Builder方法一般隻允許修改上述兩個類,其他的類一般不要修改,因為修改後如果再次執行service builder會被覆寫掉。
五、修改字段長度
Liferay自動生成的代,如String字段,預設長度是75。如果有特殊的需求,可以在src/META-INF/portlet-model-hints.xml裡面修改相應的字段映射長度。找到相應的實體,字段,如下:
<field name="InfoId" type="String" >
<hint name="max-length">300</hint>
</field>
這樣就可以将InfoId的資料庫字段長度定義為300。修改完成重新執行service-builder進行檔案生成。
六、其他技巧
1、一個service.xml檔案裡面可以有多個實體名。
2、如果要建立多個service.xml檔案,可以在WEB-IN目錄下面建立一個檔案夾,比如叫service-builder用來存儲service.xml檔案,不同的service.xml執行不同的命名,如User-Service.xml等。手動建立,不必使用向導。
3、如果按照步驟2操作,有多個service.xml檔案,則不能執行ant裡面的service-builder檔案,因為ant隻會尋找web-inf目錄下面的services.xml檔案。是以要在xx-service.xml檔案裡面切換到Diagram編輯模式,點選右鍵,build Service,這樣會對目前XML檔案進行建構。
4、即使使用了2、3的方法,也不要删除web-inf目錄下面的service.xml檔案,可以保留一份,不然最終部署後的web.xml描述檔案裡會少生成一些内容,導緻插件工程不能正常運作。
5、同一個插件工程中,不同的xx-services.xml檔案必須使用不同的包名,一個services.xml裡面可以有多個實體,但不同的services.xml裡面必須使用不同的包名,否則會導緻生成的的spring配置檔案出現覆寫情況。