持久化对象与OO事务

持久化对象与OO事务 (★★)

#abap-objects #persistent-object #oo-transaction

概览表

项目 关键点
持久化服务 将对象属性自动存入/读取数据库
持久化类 Class Builder 中创建,自动生成CRUD方法
Class Actor 管理持久化对象实例的代理类
OO事务 通过事务码调用类方法

持久化服务概述

ABAP程序中的对象通常是瞬态的 (transient) — 程序结束后消失。
持久化服务使对象可以永久存储到数据库中。

1
2
3
4
5
                    ┌─── 持久化服务 ───┐
│ │
程序 ←──→ 对象 ←──→│ 读写属性 │←──→ 数据库表
(内存) │ (自动SQL) │ (永久)
└───────────────────┘
💡本质
使用ABAP Objects技术模拟面向对象数据库管理系统(OODBMS),底层使用关系型数据库。

创建持久化类

步骤

  1. 设计类和对应的透明表
  2. 在 Class Builder 中创建持久化类(类型选择 “Persistent”)
  3. 定义持久化映射 — 属性到表字段的对应
  4. 系统自动生成:
    • Get/Set 方法
    • Class Actor (ZCA_)
    • 基础类 (ZCB_)

自动生成的类

命名 作用
持久化类 ZCL_<name> 定义属性和映射
Class Actor ZCA_<name> 管理实例,执行数据库访问
基础类 ZCB_<name> Actor 继承的基础方法

使用持久化对象

创建持久化对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
" 获取 Actor 实例(单例)
DATA(lo_agent) = zca_vehicle=>agent.

" 创建新的持久化对象
TRY.
lo_agent->create_persistent(
EXPORTING
i_make = 'BMW'
i_model = 'X5'
RECEIVING
result = DATA(lo_veh) ).
CATCH cx_os_object_existing.
" 对象已存在
ENDTRY.

" 提交到数据库
COMMIT WORK.
📌COMMIT WORK
默认使用异步更新,必须执行 COMMIT WORK 才会真正保存到数据库。

读取持久化对象

1
2
3
4
5
6
7
8
9
10
" 读取单个对象
TRY.
DATA(lo_veh) = lo_agent->get_persistent( i_make = 'BMW' ).
CATCH cx_os_object_not_found.
" 未找到
ENDTRY.

" 使用 Query Service 读取多个
DATA(lt_results) = lo_agent->get_persistent_by_query(
i_query = cl_query_manager=>create_query( ... ) ).

修改和删除

1
2
3
4
5
6
7
" 修改 — 调用 set 方法
lo_veh->set_speed( 100 ).
COMMIT WORK.

" 删除
lo_agent->delete_persistent( lo_veh ).
COMMIT WORK.

OO事务 (OO Transaction)

概念

将事务码链接到类方法,用户可以通过菜单或命令字段直接调用。

创建OO事务

  1. SE93 → 创建事务码
  2. 选择 “Method of a Class (OO Transaction)”
  3. 输入类名和方法名
  4. 可选: 设置 OO Transaction Model 标志

OO事务的限制

  • 全局类不能包含屏幕定义
  • 构造器不能有 IMPORTING 参数
  • 不能处理 ABAP 列表显示
  • 解决方案: 使用局部程序类的方法

考试/测试模式

场景/关键词 答案
“持久化对象何时保存” COMMIT WORK 之后
“Class Actor 是什么” 管理持久化对象的单例代理类
“对象已存在异常” CX_OS_OBJECT_EXISTING
“未找到对象异常” CX_OS_OBJECT_NOT_FOUND
“OO事务能链接到什么” 全局类或局部类的公有方法
“OO事务的限制” 全局类不能有屏幕、构造器不能有参数