Hybris Enterprise Commerce Platform这个系列之前已经由我的同事,SAP成都研究院Hybris开发团队的同事张健(Zhang Jonathan)发布过两篇文章了。这里Jerry要特别感谢张健,尽管最近他的第二个孩子诞生了,工作之余的生活变得更加忙碌,然而张健仍然抽出少的可怜的业余时间完成了这个系列的第三篇文章。

前两篇文章分别介绍了SAP Hybris的前端和DTO层:

本文由张健继续向我们介绍SAP Hybris的持久层即Service层。下面是他的正文。

前两篇文章分别介绍了SAP Hybris的前端和DTO层:

  • 从产品展示页面谈谈Hybris的特有概念和设计结构
  • 从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator

当我们打开Hybris某个Product的明细页面时,Hybris后台执行了下面三步逻辑:

1. Service层从数据库里把数据取出,以Model(又称为DAO对象)的形式返回给Facade层。

2. Facade层调用Converter, 在Populator的帮助下,基于Model生成了DTO。

3. Product明细页面的Controller将其对应的JSP视图路径返回给Hybris框架,通过JSP技术绘制出最后的UI。

其中步骤2和3已经在这个系列前两篇文章介绍过,本文将详细介绍上述步骤1。

Service层用XML定义的形式来管理Hybris的类型系统,既建立起与数据库表的关联,又将类型系统与具体的数据库实现进行了隔离。Service层的ModelService和Flexible Search提供了便捷的增删改查功能。让我们来一一了解。

Hybris类型系统

在DTO层的ProductFacade里,调用了Service层中获取ProductModel的方法如下。

很简单的几句代码,和其他常见的Java Web项目的Service很相似。那么ProductModel是需要开发人员自行创建吗?

应当注意ProductModel这样的POJO类(Plain Old Java Object)不需开发人员自行创建,而是通过Hybris自有的类型系统生成的。

Hybris里的类型分为两类,第一类是包含所有Hybris业务相关类型的ItemType(又称ComposedType),Product即是这种类型。第二类是为ItemType的集合属性和关系属性提供支持的DataType, 包括了 CollectionTypes, MapTypes, EnumerationTypes, RelationTypes 和 AtomicTypes。例如产品对应的多个媒体文件,就可以用CollectionTypes来定义,然后再用RelationTypes和Product类型做关联。

ABAP顾问们可以把前者(ItemType)类比成ABAP Data Dictionary里定义的包含了业务逻辑的全局数据类型,而后者就是ABAP里用STANDARD, SORTED和HASHED TABLE等等将这些业务数据类型的一个聚合。而对于Java开发者来说, CollectionTypes, MapTypes这些类型其实就是Hybris对JDK中的List, Map等类型一个更高层次的抽象。

items.xml

和Hibernate框架使用XML定义类型和数据库配置相似,Hybris类型系统的具体定义存在各个extension的items.xml文件里。比如Product类型是存在于"../hybris/bin/platform/ext/core/resources"文件夹下的core-items.xml文件内。这个文件也定义了很多Hybris核心的业务类型。

我们看一个实际的例子,即Product类型在items.xml中的定义。SAP Hybris的帮助文档里有items.xml里每个字段的详细含义,这里只介绍下图中红色高亮的字段。

extends: GenericItem。表明Product这个类型是在另一个类型GenericItem基础上做扩展。

GenericItem是根类型,相当于Java类型系统的java.lang.Object。Hybris类型系统通过继承的方式避免了字段的重复建模。

假设我们已经用上面展示的items.xml进行了Product的建模,现在有一个新的需求,定义CustomerProduct类型。从业务上说,CustomerProduct仅仅是在Product类型的基础上增加一个字段用于维护Customer ID。ABAP顾问们会新建一个CustomerProduct的结构,把Product类型通过Include的方式添加到CustomerProduct中去,通过include的方式继承前者上维护的所有字段,然后只需在CustomerProduct上定义一个新字段CUSTOMER_ID即可。

对于Hybris类型系统,思路类似,用CustomerProduct类型去extends Product类型,然后只需定义一个CustomerID字段即可。

autocreate = true: 在执行Hybris命令行ant initialize进行Hybris系统初始化时,根据items.xml的定义在数据库表中创建对应的类型。

generate = true: 在ant编译时生成该类型对应的POJO类。

以上图的Product类型为例,因为generate属性设置为true, 因此编译之后,我们能在下面的文件夹发现一个自动生成的POJO类,命名规范为Model.java:

hybrisinplatformootstrapgensrcdehybrisplatformcoremodelproduct

和ABAP很多自动生成的资源通常都放在名为$GEN之类的包的套路一样,POJO类所在的文件目录中的gensrc,也提示了该文件是自动生成的。

打开ProductModel.java查看其内容,能进一步了解items.xml里定义的属性是如何映射到这个自动生成的POJO类的:items.xml里定义的每一个类型属性,都会在POJO类里自动生成一套set和get方法。

以name属性为例,在ProductModel.java里自动生成的setName和getName:

table = Products: 数据库对应的表名,在整个Hybris类型系统唯一存在。

attribute autocreate="true" qualifier="code" type="java.lang.String" generate="true":POLO类中会出现一个新的成员,名称为code,类型为String,并带有set和get方法,ant initialize时在数据库表中创建该属性。

ModelService

定义好类型后,就需要开发相应的增删改查功能了。Hybris提供了de.hybris.platform.servicelayer.model.ModelService类作为帮助类,只需传入POJO类给对应方法,即可实现增删改查功能。这和Hibernate里的帮助类的用法是类似的。查询操作对应get方法,创建和更新对应save方法,删除操作则为remove方法。还有saveAll和removeAll方法,只需传入业务类型的集合即可实现批量增改或删除。

下图是一个例子,通过getModelService拿到ModelService实例,执行save操作。

Flexible Search

对于复杂查询,Hybris也提供了自己的查询语句Flexsible Search。如ProductDao中使用的关联Category类型的查询:

用过ADBC和JDBC的ABAP顾问和Java开发者,对上面的代码一定不会陌生。

下面是从Jerry的博客里摘出来的一张图,ADBC和JDBC的对比:

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

Hybris支持主流数据库,包括MySQL,Oracle,SQL Server及SAP HANA数据库等等。而Flexible Search概念的引入,思路类似ABAP Open SQL,通过编写不依赖于任何具体数据库提供商的Flexible Search代码,将Hybris应用层同底层数据库的具体实现做了解耦。而上面的语句中,POJO类里如ProductModel._TYPECODE 的值就是“Product”,是编译时自动生成的。因此查询语句可转译成如下文本:

问号后面的”Category“是要传入查询语句的参数名,这里即为传入了方法的参数“CategoryModel”。

到这里Hybris的Service层就基本介绍完了,而Hybris概要的系列文章也告一段落。希望大家通过这些文章对Hybris Enterprise Commerce Platform有一定的认识。感谢阅读。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

Hybris Enterprise Commerce Platform 服务层的设计与实现的更多相关文章

  1. ABAP Netweaver和Hybris Enterprise Commerce Platform的登录认证

    ABAP Netweaver 在我的博客Learn more detail about Standard logon procedure里有详细介绍. Hybris ECP Hybris Admini ...

  2. Hybris ECP(Enterprise Commerce Platform)的调试

    This blog is written to demonstrate how to setup debug environment for Hybris ECP(Enterprise Commerc ...

  3. CRUD全栈式编程架构之服务层的设计

    服务层代码 首先我先放出2个主要类的代码再分别讲解 接口 using System; using System.Collections.Generic; using System.Linq; usin ...

  4. SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考

    今天的文章来自Jerry的同事,曾经的搭档郑晓霞(Zheng Kate).郑晓霞是在Jerry心中是一位很有实力的程序媛,2011年从西安某软件公司跳槽到SAP成都研究院.当时,成都研究院的CRM团队 ...

  5. Jerry眼中的SAP客户数据模型

    本文Jerry将介绍八款SAP产品中的客户模型.希望您在阅读完本文之后,能对SAP客户模型设计的思路有一个最最粗浅的了解. 由于Jerry水平和精力所限,本文不会详细阐述这些产品里的客户模型设计细节, ...

  6. SAP 前端技术的演化史简介

    Jerry之前曾经写过一篇微信公众号文章,题目叫<> 关注我的公号"汪子熙"后,在历史菜单"前端开发相关"里即可找到这篇文章: 该文章简单回顾了SA ...

  7. 从产品展示页面谈谈Hybris的特有概念和设计结构

    今天这篇文章来自我的同事,SAP成都研究院Hybris开发团队的开发人员Zhang Jonathan(张健).需要特别介绍的是,张健和成都研究院的其他开发同事不同,张健毕业于电子科技大学,读的专业是英 ...

  8. SAP CX Upscale Commerce : SAP全新推出的电商云平台

    大家好,我是Andy Chen,是SAP成都研究院年轻的SAP CX Upscale Commerce (后面将会以Upscale简称)开发团队的一名产品经理.CX的全称是Customer Exper ...

  9. 微软职位内部推荐-SW Engineer II for Enterprise Platform

    微软近期Open的职位: Job posting title: SDE II Location: China, Beijing Group Overview Discovery & Colla ...

随机推荐

  1. EasyOffice-.NetCore一行代码导入导出Excel,生成Word

    简介 Excel和Word操作在开发过程中经常需要使用,这类工作不涉及到核心业务,但又往往不可缺少.以往的开发方式在业务代码中直接引入NPOI.Aspose或者其他第三方库,工作繁琐,耗时多,扩展性差 ...

  2. 【Python之os模块】使用

    目录 1. os.path 2. os.work   主要介绍在平时遇到的os模块的使用方法: 1. os.path 1.1 os.path.sep # 系统路径分隔符 # ============= ...

  3. oracle数据库rownum讲解(转)

    https://blog.csdn.net/qq_40794266/article/details/78698321

  4. AT2657 Mole and Abandoned Mine

    传送门 好神的状压dp啊 首先考虑一个性质,删掉之后的图一定是个联通图 并且每个点最多只与保留下来的那条路径上的一个点有边相连 然后设状态:\(f[s][t]\)代表当前联通块的点的状态为\(s\)和 ...

  5. 20165224 陆艺杰 Exp 8 Web基础

    .基础问题回答 (1)什么是表单 html的一个控件 表单在网页中主要负责数据采集功能 (2)浏览器可以解析运行什么语言 html xml jsp php python 等 (3)WebServer支 ...

  6. Python爬取天气预报

    实现爬取一天的天气预报 非常简单的一个小爬虫,利用的也是基本的request.BeautifulSoup.re库,算是简单的上手一个小测试吧 from urllib.request import ur ...

  7. Luogu P2183 [国家集训队]礼物 扩展卢卡斯+组合数

    好吧学长说是板子...学了之后才发现就是板子qwq 题意:求$ C_n^{w_1}*C_{n-w_1}^{w_2}*C_{n-w_1-w_2}^{w_3}*...\space mod \space P ...

  8. matplotlib 知识点11:绘制饼图(pie 函数精讲)

    饼图英文学名为Sector Graph,又名Pie Graph.常用于统计学模块. 画饼图用到的方法为:matplotlib.pyplot.pie( ) #!/usr/bin/env python # ...

  9. JQuery的extend扩展方法

    jQuery.extend 函数使用详解   JQuery的extend扩展方法:      Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去 ...

  10. java——变量、jvm内存划分

    基本数据变量类型:byte.short.int.long.float.double.boolean.char eg : int i = 1; 引用数据变量类型:数组.类.接口.枚举.注解 eg : S ...