持久化对象 练习
持久化对象 练习
#practice #persistent-objects #persistence-service #class-actor #oo-transactions
Related Concepts
📌核心模式 (点击展开)
| 关键词 | 答案 |
|---|---|
| 持久化服务 | ABAP Persistence Service,对象自动映射到数据库 |
| 持久化类 | 在 Class Builder 中标记为 Persistence |
| Class Actor | ZCA_ 前缀,代理持久化类的创建和管理 |
| OO 事务 | 面向对象的事务管理,替代传统 CALL TRANSACTION |
题目1 - 持久化服务概述 [记忆]
什么是 ABAP Persistence Service?它的主要目的是什么?它解决了传统数据库访问中的哪些问题?
📌查看答案
主要目的:
- 将对象的状态自动存储到数据库,无需手动编写 SQL
- 实现对象与关系数据库之间的透明映射
- 让开发者以面向对象的方式操作数据库数据
解决的问题:
- 消除 SQL 编码:不需要手动编写 INSERT/UPDATE/DELETE/SELECT
- 类型安全:属性类型与数据库字段类型自动对应
- 关注点分离:业务逻辑不需要关心存储细节
- 状态管理:自动跟踪对象的修改状态(脏标记)
- 一致性:通过事务保证数据一致性
核心组件:
- 持久化类(Persistent Class):映射到数据库表的类
- Class Actor(ZCA_):管理持久化对象的生命周期
- Persistence Agent:在后台处理实际的数据库操作
题目2 - 持久化类的创建 [记忆]
如何在 Class Builder (SE24) 中创建一个持久化类?创建过程中需要配置哪些内容?
📌查看答案
- 创建类:在 SE24 中创建类(如
ZCL_PERS_EMPLOYEE),选择类类型为 Persistent Class - 映射数据库表:
- 在 SE24 中进入「Persistence」视图
- 指定要映射的数据库表(如
ZEMPLOYEE) - 系统自动生成与表字段对应的属性
- 配置映射:
- 将表字段映射到类属性
- 设置主键字段
- 定义属性的读写模式(READ-ONLY / READ-WRITE)
自动生成的内容:
- Class Actor:系统自动生成
ZCA_<类名>类(如ZCA_PERS_EMPLOYEE) - GET/SET 方法:每个映射属性自动生成 getter 和 setter 方法
- 代理类:后台处理数据库操作的代理
重要限制:
- 持久化类不能有自定义的 CONSTRUCTOR
- 属性类型必须与数据库字段兼容
- 只能映射透明表(Transparent Table)
题目3 - Class Actor (ZCA_) 的作用 [记忆]
Class Actor 是什么?命名规范是什么?它提供了哪些关键方法?
📌查看答案
Class Actor 是持久化服务的代理类,负责创建、查找和管理持久化对象的生命周期。
命名规范:
- 持久化类:
ZCL_PERS_<名称>(如ZCL_PERS_EMPLOYEE) - Class Actor:
ZCA_PERS_<名称>(如ZCA_PERS_EMPLOYEE) - Class Agent:
ZCB_PERS_<名称>(内部代理类)
Class Actor 提供的关键方法:
| 方法 | 功能 |
|---|---|
CREATE_PERSISTENT( ) |
创建新的持久化对象并写入数据库 |
GET_PERSISTENT( ) |
根据主键查找已存在的持久化对象 |
DELETE_PERSISTENT( ) |
从数据库中删除持久化对象 |
GET_PERSISTENT_BY_QUERY( ) |
通过查询条件查找对象 |
使用示例:
1 | " 通过 Class Actor 创建对象 |
题目4 - 持久化对象的状态管理 [记忆]
持久化对象有哪些状态(State)?Persistence Service 如何跟踪这些状态?
📌查看答案
| 状态 | 说明 |
|---|---|
| NEW(新建) | 通过 CREATE_PERSISTENT 创建,尚未提交到数据库 |
| LOADED(已加载) | 从数据库加载的对象,尚未修改 |
| CHANGED(已修改) | 已加载的对象,属性被 setter 方法修改 |
| DELETED(已删除) | 通过 DELETE_PERSISTENT 标记为删除 |
| NOT_LOADED | 对象已知存在但属性尚未从数据库加载(延迟加载) |
状态跟踪机制:
- Persistence Service 通过 Class Agent 在内部维护对象的状态
- 当调用 setter 方法修改属性时,状态自动变为 CHANGED
- 当提交事务时,Service 根据状态执行相应的 SQL 操作:
- NEW → INSERT
- CHANGED → UPDATE
- DELETED → DELETE
- LOADED → 不执行任何操作
这种机制实现了 脏标记(Dirty Checking),只同步真正修改过的对象。
题目5 - OO 事务管理 [记忆]
在持久化对象中如何管理数据库事务?列出关键的事务管理语句。
📌查看答案
持久化服务使用自己的事务管理机制,与传统的
COMMIT WORK / ROLLBACK WORK 配合使用。关键事务语句:
1 | " 开始事务——通常隐式开始 |
事务管理要点:
COMMIT WORK触发 Persistence Service 将所有 NEW/CHANGED 状态的对象同步到数据库ROLLBACK WORK撤销当前事务中所有未提交的更改,对象状态恢复- 在提交前,所有更改只存在于内存中
- 提交后,对象的临时状态(NEW/CHANGED)重置为 LOADED
与 LUW 的关系:
- 持久化对象的事务是 SAP LUW(逻辑工作单元)的一部分
- 可以与传统数据库操作混合使用,但需注意一致性
题目6 - 持久化服务 vs 传统 OPEN SQL [分析]
比较 ABAP Persistence Service 和传统 OPEN SQL 方式的优缺点。在什么场景下应该选择持久化服务,什么场景下不应使用?
📌查看答案
| 维度 | Persistence Service | OPEN SQL |
|---|---|---|
| 编码量 | 少(自动生成) | 多(手动编写) |
| 类型安全 | 高(编译时检查) | 中(使用结构体) |
| 性能 | 较低(额外抽象层) | 较高(直接访问) |
| 批量操作 | 不适合 | 非常适合 |
| 复杂查询 | 受限(需 Query 类) | 灵活(JOIN、子查询) |
| 学习曲线 | 较陡 | 低 |
| 调试难度 | 较高(自动化代码) | 低 |
| 灵活性 | 低(映射固定) | 高 |
适合使用持久化服务的场景:
- 对象模型与数据库表高度匹配
- 需要严格的 OOP 封装
- 单条记录的 CRUD 操作为主
- 业务逻辑集中在对象方法中
不应使用持久化服务的场景:
- 批量数据处理(如报表)
- 复杂的多表 JOIN 查询
- 性能敏感的操作
- 已有大量 OPEN SQL 代码的项目
- 数据库特定功能(如 HINT、聚合函数)
题目7 - 持久化对象编程 [应用]
请编写代码,使用持久化服务完成以下操作:1) 创建一个新的员工记录;2) 修改该员工的部门;3) 查询该员工信息并输出;4) 如果出错则回滚。
📌查看答案
1 | DATA: lo_employee TYPE REF TO zcl_pers_employee, |
关键点:
CREATE_PERSISTENT创建新记录GET_PERSISTENT查找已有记录- setter 方法修改后需要
COMMIT WORK提交 - 异常处理中使用
ROLLBACK WORK回滚
题目8 - Class Actor 的查询功能 [应用]
说明如何使用 Class Actor 的查询功能(Query)来查找满足特定条件的持久化对象。请编写代码示例:查找所有部门为 ‘IT’ 且薪资大于 5000 的员工。
📌查看答案
GET_PERSISTENT_BY_QUERY 方法进行条件查询:1 | DATA: lo_query TYPE REF TO if_os_query, |
注意:复杂条件查询也可以在获取结果集后在 ABAP 层进一步过滤(如上例中的薪资条件)。对于大量数据,建议使用传统的 OPEN SQL 而非持久化查询。
📌模式总结 (点击展开)
| 关键词 | 答案 |
|---|---|
| 持久化服务 | ABAP ORM,对象自动映射到数据库 |
| 持久化类 | SE24 中创建,映射到透明表 |
| Class Actor | ZCA_ 前缀,管理对象生命周期 |
| Class Agent | ZCB_ 前缀,内部代理处理 DB 操作 |
| CREATE_PERSISTENT | 创建新持久化对象 |
| GET_PERSISTENT | 按主键查找对象 |
| DELETE_PERSISTENT | 删除持久化对象 |
| 对象状态 | NEW / LOADED / CHANGED / DELETED |
| 事务提交 | COMMIT WORK 同步到数据库 |
| 事务回滚 | ROLLBACK WORK 撤销更改 |
| 适用场景 | 单记录 CRUD、严格 OOP |
| 不适用场景 | 批量处理、复杂查询、性能敏感 |