持久化对象与OO事务
持久化对象与OO事务 (★★)
#abap-objects #persistent-object #oo-transaction
概览表
| 项目 | 关键点 |
|---|---|
| 持久化服务 | 将对象属性自动存入/读取数据库 |
| 持久化类 | Class Builder 中创建,自动生成CRUD方法 |
| Class Actor | 管理持久化对象实例的代理类 |
| OO事务 | 通过事务码调用类方法 |
持久化服务概述
ABAP程序中的对象通常是瞬态的 (transient) — 程序结束后消失。
持久化服务使对象可以永久存储到数据库中。
1 | ┌─── 持久化服务 ───┐ |
💡本质
使用ABAP Objects技术模拟面向对象数据库管理系统(OODBMS),底层使用关系型数据库。
创建持久化类
步骤
- 设计类和对应的透明表
- 在 Class Builder 中创建持久化类(类型选择 “Persistent”)
- 定义持久化映射 — 属性到表字段的对应
- 系统自动生成:
- Get/Set 方法
- Class Actor (ZCA_
) - 基础类 (ZCB_
)
自动生成的类
| 类 | 命名 | 作用 |
|---|---|---|
| 持久化类 | ZCL_<name> |
定义属性和映射 |
| Class Actor | ZCA_<name> |
管理实例,执行数据库访问 |
| 基础类 | ZCB_<name> |
Actor 继承的基础方法 |
使用持久化对象
创建持久化对象
1 | " 获取 Actor 实例(单例) |
📌COMMIT WORK
默认使用异步更新,必须执行
COMMIT WORK 才会真正保存到数据库。读取持久化对象
1 | " 读取单个对象 |
修改和删除
1 | " 修改 — 调用 set 方法 |
OO事务 (OO Transaction)
概念
将事务码链接到类方法,用户可以通过菜单或命令字段直接调用。
创建OO事务
- SE93 → 创建事务码
- 选择 “Method of a Class (OO Transaction)”
- 输入类名和方法名
- 可选: 设置 OO Transaction Model 标志
OO事务的限制
- 全局类不能包含屏幕定义
- 构造器不能有 IMPORTING 参数
- 不能处理 ABAP 列表显示
- 解决方案: 使用局部程序类的方法
考试/测试模式
| 场景/关键词 | 答案 |
|---|---|
| “持久化对象何时保存” | COMMIT WORK 之后 |
| “Class Actor 是什么” | 管理持久化对象的单例代理类 |
| “对象已存在异常” | CX_OS_OBJECT_EXISTING |
| “未找到对象异常” | CX_OS_OBJECT_NOT_FOUND |
| “OO事务能链接到什么” | 全局类或局部类的公有方法 |
| “OO事务的限制” | 全局类不能有屏幕、构造器不能有参数 |