SAP Cloud Application Programming 模型的推荐是将 service 和 model 模型的定义分离开。 因此,我们在 db 文件夹里定义 model model. 新建一个 namespace sap.capire.products; using { Currency, cuid, managed, sap.common.CodeList } from '@sap/cds/common'; entity Products : cuid, managed { title : localized String(111); descr : localized String(1111); stock : Integer; price : Decimal(9,2); currency : Currency; category : Association to Categories; } entity Categories : CodeList { key ID : Integer; parent : Association to Categories; children : Composition of many Categories on children.parent = $self; } 内容如下: 这里用关键字
Associations 和 Compositions
虽然关联定义了实体之间相当松散的耦合,但组合定义了包含关系。 组合也可以被认为是定义深层结构。 可以沿这些结构执行深度插入和更新插入。 在域模型中,类别实体定义了父元素和子元素。 这启用了类别的层次结构。 一个类别的 children entity 被建模为一个组合。 一个包含所有子类的类别定义了一个深层嵌套结构。 删除一个类别将自动删除其所有子项。 然而,一个类别的父类被建模为一个关联。 删除一个类别显然不应该删除它的父类。 cuid 和 managed 都是 managed aspect 将创建和修改时间戳等字段添加到 entity 内。 我们按住 ctrl 键 + 左键,就能查看到这些 aspect 对应的实现: CodeLists 可用于存储基于代码(例如货币、国家或语言)的全局可翻译定义。 特别是对于 UI,CodeList 可用于为某些输入字段提供值帮助。
在 service 定义里,将 domain model 里某些字段暴露出来: 下面我们需要将 domain model 部署到 sqllite 里。 首先使用命令行安装 npm install --save-dev sqlite3 运行如下命令行,使用命令行将 domain model 初始化 sqlite: cds deploy --to sqlite 下一步我们需要将 spring boot 应用同 sqlite 数据库建立关联关系。 打开 main/resources/application.yaml 文件: ---spring: profiles: default datasource: url: "jdbc:sqlite:/home/user/projects/products-service/sqlite.db" driver-class-name: org.sqlite.JDBC initialization-mode: never hikari: maximum-pool-size: 1 使用 curl 插入一条新的数据: curl -X POST http://localhost:8080/odata/v4/AdminService/Categories \-H "Content-Type: application/json" \-d '{"ID": 1, "name": "TechEd", "descr": "TechEd related topics", "children": [{"ID": 10, "name": "CAP Java", "descr": "Run on Java"}, {"ID": 11, "name": "CAP Node.js", "descr": "Run on Node.js"}]}' 然后使用下面的 url,即可成功访问刚刚插入的 categories 数据: |
|