本教程介绍
如何实现深嵌件在里面SAP云应用编程模型(第2部分:使用UUID)
快速链接:示例项目文件第一部分:简介第3部分:多层次第4部分:使用远程服务第五部分:SDK远程服务
这个博客是为了报道一个我想对大多数CAP用户来说都是相关的案例:在CDS模型中,关键字段经常使用的数据类型是UUID:
好处是框架可以生成值。它影响CREATE操作,用户不发送key属性的值因此,它也会影响DEEP INSERT
让我们来详细查看它
请注意,这个博客建立在我们创建项目的前一个博客上,学习如何实现DEEP INSERT
新需求
在前一个博客中,我们为没有生成键值的模型实现DEEP INSERT让我们看看我们的请求负载:
{"公司ID":3,"companyName":"啤酒店","linkToContact\u contactId":"contactForberShop","链接联系人":{"contactId":"contactForberShop","contactName":"彼得","联系电话":9876543}
我们可以看到我们已经通过了每一处房产但实际上,我们不希望传递ID值,物联网的前景,大数据要学什么,而是希望它自动生成所以我们将从有效载荷中删除关键字段:
{"companyName":"啤酒店","linkToContact\u contactId":"contactForberShop","链接联系人":{"contactName":"彼得","联系电话":9876543}
但是在上面的负载中,有一个问题:我们不知道外键值,因为它应该被生成:"linkToContact\u contactId":"哪个contactId?",不,必须由服务器填写所以我们从有效载荷中去掉这个字段:
{"companyName":"啤酒店","链接联系人":{"contactName":"彼得","联系电话":9876543}
应该是这样的:用户不关心ID。生成和分配由服务
完成,但如何实现?好吧,记住:服务-这就是我们
我们需要一些代码。CDS模型的一点变化
处理UUID
您可以创建一个新项目,或者只对现有项目应用两点变化:将分配给键属性的数据类型更改为UUID,对于这两个实体:
除了这两个小更改之外,上一个blog的所有其他项目都保持不变。当然,我们需要在java代码中添加几行代码
注意:在重新部署mtar后,由于表METADATA
的更改,您的现有数据将消失,上述要求需要我们付出额外的努力。将数据类型更改为UUID是不够的。
UUID的键值通常由FWK生成,但不适用于深插入中的嵌套实体
第二个re要求:价值外键元素。如果FWK没有生成UUID,那么显然它不能被自动分配到外键字段
这两个任务都必须在我们的自定义代码中处理
正如所指出的,云服务器厂商,除了上面的实现之外,我们还需要手动实现2个小任务:
1。生成内联实体的键值
如我们所知,物联网应用,如果我们将UUID指定为CDS中键字段的数据类型,那么该值将由FWK生成对于OData服务的用户来说,这具有以下优势:使用POST请求创建条目时,他不需要发送请求正文中的key属性
但是:这只适用于普通的CREATE请求。如果是deep insert,则只会动态生成父实体(CompanyEntity)的键值。但不适用于关联实体(ContactEntity)。因为FWK不知道哪个是关键属性。因为它是在我们的实现代码到达之前完成的
解决方案:我们必须手动为deep insert中的关联实体生成UUID
在这个片段中,我们可以看到:我们生成一个UUID(在OData中,类型是Edm.Guid文件)手动要将UUID设置为嵌套ContactEntity的键值,我们必须获取相应的映射我们有一个映射,它表示POST请求的有效负载。它包含父实体和嵌套的子实体地图包含一个作为导航属性的键("linkToContact")值是一个映射,它是嵌套实体(ContactEntity)的数据。这就是将创建的内联,深插入。在这个嵌套映射中,我们必须为键字段(contactId)设置值(UUID)如果最终用户已经传递了一个值,商业大数据分析,它将被重写,这是所需的行为。
顺便说一句,上面的代码必须被一个小检查包围,这样它只能在深插入时运行。
2。外键值
我们已经生成了一个GUID并将其设置为嵌套实体的键值。这是协会的目标。因此,此时,数据库上的CREATE操作将在2个表中创建2个新行但是新的公司条目需要知道联系人的ID,否则导航将无法工作。因此,现在我们必须为父实体的外键字段设置相同的值
记住:在我们的CDS模型中,我们有一个从公司实体到联系人实体的管理关联"托管"是指CDS向公司实体生成一个属性,该属性携带关联联系人实体的外键也就是说,公司知道联系人列表中哪个联系人属于公司生成的属性在edmx中可见。因此,在为联系人生成guid时,我们必须将此guid设置为CompanyEntity的外键属性的值这是在下面的行中完成的:
我们有一个地图,其中包含将在数据库中创建的所有数据。在这个映射中,我们设置了外键属性的值("linkToContact\u contactId")
外键属性的名称是由CDS生成的,因此必须在(生成的)edmx或CSN文件(在src/main/resources/edmx文件夹中)中搜索它
请参阅附录中的完整代码
测试它
部署后,尝试用这个负载进行深度插入:
它应该工作没有错误,两个实体都应该创建,导航(或$expand)应该工作良好
摘要