溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

發(fā)布時間:2021-12-18 17:20:09 來源:億速云 閱讀:172 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(guān)Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

我們來介紹SAP Hybris的持久層即Service層。

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

當我們打開Hybris某個Product的明細頁面時,Hybris后臺執(zhí)行了下面三步邏輯:

1. Service層從數(shù)據(jù)庫里把數(shù)據(jù)取出,以Model(又稱為DAO對象)的形式返回給Facade層。

2. Facade層調(diào)用Converter, 在Populator的幫助下,基于Model生成了DTO。

3. Product明細頁面的Controller將其對應(yīng)的JSP視圖路徑返回給Hybris框架,通過JSP技術(shù)繪制出最后的UI。

其中步驟2和3已經(jīng)在這個系列前兩篇文章介紹過,本文將詳細介紹上述步驟1。

Service層用XML定義的形式來管理Hybris的類型系統(tǒng),既建立起與數(shù)據(jù)庫表的關(guān)聯(lián),又將類型系統(tǒng)與具體的數(shù)據(jù)庫實現(xiàn)進行了隔離。Service層的ModelService和Flexible Search提供了便捷的增刪改查功能。讓我們來一一了解。

Hybris類型系統(tǒng)

在DTO層的ProductFacade里,調(diào)用了Service層中獲取ProductModel的方法如下。

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

很簡單的幾句代碼,和其他常見的Java Web項目的Service很相似。那么ProductModel是需要開發(fā)人員自行創(chuàng)建嗎?

應(yīng)當注意ProductModel這樣的POJO類(Plain Old Java Object)不需開發(fā)人員自行創(chuàng)建,而是通過Hybris自有的類型系統(tǒng)生成的。

Hybris里的類型分為兩類,第一類是包含所有Hybris業(yè)務(wù)相關(guān)類型的ItemType(又稱ComposedType),Product即是這種類型。第二類是為ItemType的集合屬性和關(guān)系屬性提供支持的DataType, 包括了 CollectionTypes, MapTypes, EnumerationTypes, RelationTypes 和 AtomicTypes。例如產(chǎn)品對應(yīng)的多個媒體文件,就可以用CollectionTypes來定義,然后再用RelationTypes和Product類型做關(guān)聯(lián)。

ABAP顧問們可以把前者(ItemType)類比成ABAP Data Dictionary里定義的包含了業(yè)務(wù)邏輯的全局數(shù)據(jù)類型,而后者就是ABAP里用STANDARD, SORTED和HASHED TABLE等等將這些業(yè)務(wù)數(shù)據(jù)類型的一個聚合。而對于Java開發(fā)者來說, CollectionTypes, MapTypes這些類型其實就是Hybris對JDK中的List, Map等類型一個更高層次的抽象。

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

items.xml

和Hibernate框架使用XML定義類型和數(shù)據(jù)庫配置相似,Hybris類型系統(tǒng)的具體定義存在各個extension的items.xml文件里。比如Product類型是存在于"../hybris/bin/platform/ext/core/resources"文件夾下的core-items.xml文件內(nèi)。這個文件也定義了很多Hybris核心的業(yè)務(wù)類型。

我們看一個實際的例子,即Product類型在items.xml中的定義。SAP Hybris的幫助文檔里有items.xml里每個字段的詳細含義,這里只介紹下圖中紅色高亮的字段。

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

extends: GenericItem。表明Product這個類型是在另一個類型GenericItem基礎(chǔ)上做擴展。

GenericItem是根類型,相當于Java類型系統(tǒng)的java.lang.Object。Hybris類型系統(tǒng)通過繼承的方式避免了字段的重復(fù)建模。

假設(shè)我們已經(jīng)用上面展示的items.xml進行了Product的建模,現(xiàn)在有一個新的需求,定義CustomerProduct類型。從業(yè)務(wù)上說,CustomerProduct僅僅是在Product類型的基礎(chǔ)上增加一個字段用于維護Customer ID。ABAP顧問們會新建一個CustomerProduct的結(jié)構(gòu),把Product類型通過Include的方式添加到CustomerProduct中去,通過include的方式繼承前者上維護的所有字段,然后只需在CustomerProduct上定義一個新字段CUSTOMER_ID即可。

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

對于Hybris類型系統(tǒng),思路類似,用CustomerProduct類型去extends Product類型,然后只需定義一個CustomerID字段即可。

autocreate = true: 在執(zhí)行Hybris命令行ant initialize進行Hybris系統(tǒng)初始化時,根據(jù)items.xml的定義在數(shù)據(jù)庫表中創(chuàng)建對應(yīng)的類型。

generate = true: 在ant編譯時生成該類型對應(yīng)的POJO類。

以上圖的Product類型為例,因為generate屬性設(shè)置為true, 因此編譯之后,我們能在下面的文件夾發(fā)現(xiàn)一個自動生成的POJO類,命名規(guī)范為<類型名稱>Model.java:

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

hybrisinplatformootstrapgensrcdehybrisplatformcoremodelproduct

和ABAP很多自動生成的資源通常都放在名為$GEN之類的包的套路一樣,POJO類所在的文件目錄中的gensrc,也提示了該文件是自動生成的。

打開ProductModel.java查看其內(nèi)容,能進一步了解items.xml里定義的屬性是如何映射到這個自動生成的POJO類的:items.xml里定義的每一個類型屬性,都會在POJO類里自動生成一套set和get方法。

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

以name屬性為例,在ProductModel.java里自動生成的setName和getName:

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

table = Products: 數(shù)據(jù)庫對應(yīng)的表名,在整個Hybris類型系統(tǒng)唯一存在。

attribute autocreate="true" qualifier="code" type="java.lang.String" generate="true":POLO類中會出現(xiàn)一個新的成員,名稱為code,類型為String,并帶有set和get方法,ant initialize時在數(shù)據(jù)庫表中創(chuàng)建該屬性。

ModelService

定義好類型后,就需要開發(fā)相應(yīng)的增刪改查功能了。Hybris提供了de.hybris.platform.servicelayer.model.ModelService類作為幫助類,只需傳入POJO類給對應(yīng)方法,即可實現(xiàn)增刪改查功能。這和Hibernate里的幫助類的用法是類似的。查詢操作對應(yīng)get方法,創(chuàng)建和更新對應(yīng)save方法,刪除操作則為remove方法。還有saveAll和removeAll方法,只需傳入業(yè)務(wù)類型的集合即可實現(xiàn)批量增改或刪除。

下圖是一個例子,通過getModelService拿到ModelService實例,執(zhí)行save操作。

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

Flexible Search

對于復(fù)雜查詢,Hybris也提供了自己的查詢語句Flexsible Search。如ProductDao中使用的關(guān)聯(lián)Category類型的查詢:

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

用過ADBC和JDBC的ABAP顧問和Java開發(fā)者,對上面的代碼一定不會陌生。

下面是從Jerry的博客里摘出來的一張圖,ADBC和JDBC的對比:

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

https://blogs.sap.com/2017/05/08/adbc-and-jdbc/

Hybris支持主流數(shù)據(jù)庫,包括MySQL,Oracle,SQL Server及SAP HANA數(shù)據(jù)庫等等。而Flexible Search概念的引入,思路類似ABAP Open SQL,通過編寫不依賴于任何具體數(shù)據(jù)庫提供商的Flexible Search代碼,將Hybris應(yīng)用層同底層數(shù)據(jù)庫的具體實現(xiàn)做了解耦。而上面的語句中,POJO類里如ProductModel._TYPECODE 的值就是“Product”,是編譯時自動生成的。因此查詢語句可轉(zhuǎn)譯成如下文本:

Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的

問號后面的”Category“是要傳入查詢語句的參數(shù)名,這里即為傳入了方法的參數(shù)“CategoryModel”。

以上就是Hybris Enterprise Commerce Platform 服務(wù)層的設(shè)計與實現(xiàn)是怎樣的,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI