持久化对象 练习

持久化对象 练习

#practice #persistent-objects #persistence-service #class-actor #oo-transactions

📌核心模式 (点击展开)
关键词 答案
持久化服务 ABAP Persistence Service,对象自动映射到数据库
持久化类 在 Class Builder 中标记为 Persistence
Class Actor ZCA_ 前缀,代理持久化类的创建和管理
OO 事务 面向对象的事务管理,替代传统 CALL TRANSACTION

题目1 - 持久化服务概述 [记忆]

什么是 ABAP Persistence Service?它的主要目的是什么?它解决了传统数据库访问中的哪些问题?

📌查看答案
ABAP Persistence Service 是 SAP 提供的一种对象关系映射(ORM)机制,将 ABAP 对象自动映射到数据库表记录。

主要目的

  • 将对象的状态自动存储到数据库,无需手动编写 SQL
  • 实现对象与关系数据库之间的透明映射
  • 让开发者以面向对象的方式操作数据库数据

解决的问题

  1. 消除 SQL 编码:不需要手动编写 INSERT/UPDATE/DELETE/SELECT
  2. 类型安全:属性类型与数据库字段类型自动对应
  3. 关注点分离:业务逻辑不需要关心存储细节
  4. 状态管理:自动跟踪对象的修改状态(脏标记)
  5. 一致性:通过事务保证数据一致性

核心组件

  • 持久化类(Persistent Class):映射到数据库表的类
  • Class Actor(ZCA_):管理持久化对象的生命周期
  • Persistence Agent:在后台处理实际的数据库操作

题目2 - 持久化类的创建 [记忆]

如何在 Class Builder (SE24) 中创建一个持久化类?创建过程中需要配置哪些内容?

📌查看答案
创建持久化类的步骤
  1. 创建类:在 SE24 中创建类(如 ZCL_PERS_EMPLOYEE),选择类类型为 Persistent Class
  2. 映射数据库表
    • 在 SE24 中进入「Persistence」视图
    • 指定要映射的数据库表(如 ZEMPLOYEE
    • 系统自动生成与表字段对应的属性
  3. 配置映射
    • 将表字段映射到类属性
    • 设置主键字段
    • 定义属性的读写模式(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 定义
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
2
3
4
5
6
7
8
9
" 通过 Class Actor 创建对象
DATA(lo_employee) = zca_pers_employee=>agent->create_persistent(
i_employee_id = '001'
i_name = '张三'
i_department = 'IT' ).

" 查找已有对象
DATA(lo_emp) = zca_pers_employee=>agent->get_persistent(
i_employee_id = '001' ).

题目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 事务管理 [记忆]

在持久化对象中如何管理数据库事务?列出关键的事务管理语句。

📌查看答案
OO 事务管理
持久化服务使用自己的事务管理机制,与传统的 COMMIT WORK / ROLLBACK WORK 配合使用。

关键事务语句

1
2
3
4
5
6
7
8
9
10
11
" 开始事务——通常隐式开始

" 创建或修改持久化对象
DATA(lo_obj) = zca_pers_employee=>agent->create_persistent( ... ).
lo_obj->set_name( '李四' ).

" 提交事务——将所有挂起的更改写入数据库
COMMIT WORK.

" 回滚事务——撤销所有未提交的更改
ROLLBACK WORK.

事务管理要点

  1. COMMIT WORK 触发 Persistence Service 将所有 NEW/CHANGED 状态的对象同步到数据库
  2. ROLLBACK WORK 撤销当前事务中所有未提交的更改,对象状态恢复
  3. 在提交前,所有更改只存在于内存中
  4. 提交后,对象的临时状态(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
DATA: lo_employee TYPE REF TO zcl_pers_employee,
lo_exception TYPE REF TO cx_root.

TRY.
" 1. 创建新员工记录
lo_employee = zca_pers_employee=>agent->create_persistent(
i_employee_id = 'EMP001'
i_name = '王五'
i_department = 'SALES'
i_salary = 5000 ).

" 2. 修改部门
lo_employee->set_department( 'IT' ).

" 3. 查询并输出
DATA(lo_found) = zca_pers_employee=>agent->get_persistent(
i_employee_id = 'EMP001' ).

WRITE: / '员工ID:', lo_found->get_employee_id( ),
/ '姓名:', lo_found->get_name( ),
/ '部门:', lo_found->get_department( ),
/ '薪资:', lo_found->get_salary( ).

" 提交事务
COMMIT WORK.
WRITE: / '事务已提交'.

CATCH cx_root INTO lo_exception.
" 4. 出错回滚
ROLLBACK WORK.
WRITE: / '错误:', lo_exception->get_text( ).
WRITE: / '事务已回滚'.
ENDTRY.

关键点:

  • CREATE_PERSISTENT 创建新记录
  • GET_PERSISTENT 查找已有记录
  • setter 方法修改后需要 COMMIT WORK 提交
  • 异常处理中使用 ROLLBACK WORK 回滚

题目8 - Class Actor 的查询功能 [应用]

说明如何使用 Class Actor 的查询功能(Query)来查找满足特定条件的持久化对象。请编写代码示例:查找所有部门为 ‘IT’ 且薪资大于 5000 的员工。

📌查看答案
使用 GET_PERSISTENT_BY_QUERY 方法进行条件查询:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DATA: lo_query      TYPE REF TO if_os_query,
lt_employees TYPE osreftab,
lo_employee TYPE REF TO zcl_pers_employee.

TRY.
" 创建查询对象
lo_query = cl_os_system=>get_query_manager( )->create_query(
iv_object = 'ZCL_PERS_EMPLOYEE'
iv_language = sy-langu ).

" 使用条件查询
" 方式1: 通过 Query Manager 创建带条件的查询
DATA(lo_query_manager) = cl_os_system=>get_query_manager( ).
DATA(lo_condition) = lo_query_manager->create_query_condition(
iv_attribute = 'DEPARTMENT'
iv_operator = '='
iv_value = 'IT' ).

" 获取结果
lt_employees = zca_pers_employee=>agent->get_persistent_by_query(
i_query = lo_query ).

" 遍历结果
LOOP AT lt_employees INTO lo_employee.
IF lo_employee->get_salary( ) > 5000.
WRITE: / lo_employee->get_employee_id( ),
lo_employee->get_name( ),
lo_employee->get_department( ),
lo_employee->get_salary( ).
ENDIF.
ENDLOOP.

CATCH cx_root INTO DATA(lo_err).
WRITE: / '查询错误:', lo_err->get_text( ).
ENDTRY.

注意:复杂条件查询也可以在获取结果集后在 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
不适用场景 批量处理、复杂查询、性能敏感