[错误]CD.编译失败
呃,多么糟糕的教程开始…
今天让我们从一个错误消息开始。请阅读:
关联""不能隐式重定向
什么???稍等,错误信息继续显示:
目标""在服务""中通过多个投影曝光:""、""
我一个字都听不懂。是的,谢谢。所以你才在这里。我不知道我为什么在这里,我在这个歌舞厅里浪费时间在这个博客中,我们将解释这个错误哦,太棒了…并为您提供解决方案啊,太好了!我将承担歌舞表演
但在我们开始之前,这里是通常必要的链接我记在心里了对于那些不知道这是什么的人:SAP云平台后端服务新用户系列教程
背景:想象一下,为了设计一个复杂的模型,你投入了大量的精力。然后,您可以很高兴地生成一个API–但是您会得到上面的错误消息(在按下"logs"图标时可以查看)当然,你一个字都不懂——我们已经证明了这一点(见上文)但不要惊慌——你不是一个人,你有我的博客。专家可以跳到解决方案
第一阶段:为什么要为一个实体类型定义两个实体集?
让我们从头开始解释这一切。
不,让我们从头开始:您有一个web应用程序。web应用程序允许从您的宠物店选择动物。不错,我选了只猫当然,每个人都想要一个可爱的小猫
应用层:web应用
回到你的应用
你的web应用有两个列表:–正常动物–危险动物
为了实现此要求(2个动物列表),大数据分析培训,应用程序可以执行以下操作(假设应用程序使用类似PetShopService的OData服务):
1。正常使用一个带过滤器的服务集合
呼叫所有服务动物:宿主…动物采集打电话给服务部门,只过滤危险的东西动物:宿主…动物采集?$filter=isDangerous EQ'true'
2。但还有另一种可能性:
像以前一样,调用同一个集合来获取所有animalhost…//AnimalCollection仅为危险的动物主机调用单独的集合…//DangerousAnimalCollection
第二种可能性更方便,可能性能更好但是:必须由OData服务实现
注意:当谈到使用应用程序时,我们总是提到运行时。应用程序使用正在运行的服务获取数据
下一层:OData服务
在运行时,我们根据OData服务定义访问一个URL。URL基于OData服务公开的实体集组成
如上所述,应用程序对OData服务有要求。要求是:所有动物都应该有一个数据存储器服务应提供2种访问方式
更详细:OData服务应该定义2个实体集:
如果应用程序没有定义过滤器,那么我们如何获得真正危险的动物,比如猫?
正确,这样的需求必须在服务本身,在服务器上运行的java代码(到目前为止一直是java代码)中实现它就像一个硬编码的过滤器
我们想要吗?
是的,我们希望应用程序是轻量级的,只有UI,相反,将大部分逻辑移到java实现上。
谈到java实现,有(同样)两种可能性如何实现过滤器:1从数据库中提取所有动物,然后在java代码中进行过滤2只从数据库中获取危险的动物
第二种可能性更快,因为根本没有获取无用的数据E、 g.在数据库上使用不同的SQL语句
这将引导我们进入下一层:
下一层:数据库
噢–我总是听说后端服务处理数据库?好的一点,我们不接触任何数据库,但是我们定义了导致生成数据库表的模型
记住我们上面说的:
"所有动物的一个数据存储""2种访问方式"
用CD表示:在数据模型中,我们定义了一个实体在服务定义中,我们将两个实体公开为同一数据模型实体上的投影
更进一步,我们可以说数据模型就像定义designtime工件,即稍后在部署期间生成的表和列的名称。我们可以说,在服务定义中,我们表达了我们希望生成的服务在运行时的行为在数据模型中,我们定义了一个实体
实体动物性{。}
在服务定义中,我们公开了2个实体作为同一数据模型实体上的投影
实体AnimalCollection作为AnimalEntity上的投影;实体危险的动物集合作为动物性的投影;
下一层:…
我们没有下一层。
总结:我们已经了解了为什么定义一个由两个投影暴露一个实体的模型是有意义的。换句话说,定义一个服务公开两个实体,它们是同一个数据模型实体上的投影。
我们可以继续创建一个基于这个简单CDS模型的API:
注意:select语句在上一个教程中解释过
为了测试,我们执行以下URL:
https://…/odatav4/DEFAULT/PETSHOPSERVICE/AnimalCollection
结果:所有动物:
如果没有第二个集合,我们就必须执行此筛选:
https://…/PETSHOPSERVICE/AnimalCollection?$filter=isDangerous EQ true
结果:仅危险动物:
上次测试:第二次采集,云服务器好还是,为方便起见:
https://…/PETSHOPSERVICE/DangerousAnimalCollection
如预期,云服务器是什么,结果有效载荷与上次测试相同: