学习笔记持久类和对象持久化的应用

Posted SAP剑客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记持久类和对象持久化的应用相关的知识,希望对你有一定的参考价值。

持久类和对象持久化的应用

整理转自 —《SAP ABAP 面向对象程序设计(原则、模式及实践)》

对于一般的面向对象语言,对象持久化通常是指将对象存储于数据库或者磁盘文件中,便于以后调用处理,也就是通过操作将内存中的对象保存到数据库或者文件中。

对于ABAP程序,持久化一般是保存到数据库表中,ABAP也提供了自动化方式和服务来帮助我们管理和操作持久化对象。

【实例】

下面通过一个简单实例来说明:系统中的一个类对象,在业务处理中属性被赋予了不同的值,我们将对象实例的属性值存储到SAP数据库自定义表中,并支持读取功能,即可将该对象从数据库中调出,将提取出的属性值赋值给对象实例,以便业务继续处理。

一、创建自定义表用于存储持久化后的对象。

维护持久性可通过一下两种方式:

  • 使用Business Key,即采用数据列作为主键;
  • 使用GUID,即SAP提供的全局标识符(类型OS_GUID);

二、创建全局类,类型为持久类(Persistent Class)。

选择了创建持久类(Persistent Class),类实例的属性会自动调整为受保护(Protected)。

点击持久性(Persistence)按钮(或者通过菜单“转到”→“持久性代表”),维护与持久类相关的数据库表。输入自定义表名,然后分配需要持久化的列。

分配好属性后点击“生成器设置”按钮设定创建持久类的设定。

一般需要将最后一个复选框(方法CREATE PERSISTENT和CREATE TRANSIENT使用最小接口)勾选去掉,如果勾选了,生成的持久类会仅仅针对自定义表的主键进行记录创建,而忽略其他属性。

然后保存,返回后发现系统自动创建了属性以及存取属性的方法。

最后激活该类,会提示是否创建类行动者,点击“是”系统将为这个持久类创建对应的操作用的虚拟类和操作类。

三、创建测试程序,将实例化的持久化类存入数据库并进行查询和删除操作。

代码分别调用系统自动生成的方法:GET_PERSISTENT、CREATE_PERSISTENT、DELETE_PERSISTENT,传入适当的参数,即可实现类的持久化操作。

【源代码】

*&---------------------------------------------------------------------*
*& Report  ZPRT_PERSIST_MARA_GUID
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZPRT_PERSIST_MARA_GUID.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS : P_GET RADIOBUTTON GROUP G1,
             P_CRE RADIOBUTTON GROUP G1,
             P_DEL RADIOBUTTON GROUP G1.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
PARAMETERS :
            P_MATNR LIKE ZTB_MARA_KEY-MATNR,
            P_MAKTX LIKE ZTB_MARA_KEY-MAKTX,
            P_ERSDA LIKE ZTB_MARA_KEY-ERSDA,
            P_MTART LIKE ZTB_MARA_KEY-MTART,
            P_MATKL LIKE ZTB_MARA_KEY-MATKL.
SELECTION-SCREEN END OF BLOCK B2.

DATA : GO_MATERIAL_AGENT TYPE REF TO ZCA_PERSIST_MARA_KEY,
       GO_RESULT_OBJ TYPE REF TO OBJECT,
       GO_MATERIAL_KEY TYPE REF TO ZCL_PERSIST_MARA_KEY.

START-OF-SELECTION.

  "创建操作类对象
  GO_MATERIAL_AGENT = ZCA_PERSIST_MARA_KEY=>AGENT.

  IF P_GET = 'X'.

    TRY.
        "调用操作类,读取持久化记录,初始化持久类并对属性赋值
        CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
          EXPORTING
            I_MATNR = P_MATNR
          RECEIVING
            RESULT  = GO_RESULT_OBJ.
        GO_MATERIAL_KEY ?= GO_RESULT_OBJ.
        P_MAKTX = GO_MATERIAL_KEY->GET_MAKTX( ).
        P_ERSDA = GO_MATERIAL_KEY->GET_ERSDA( ).
        P_MTART = GO_MATERIAL_KEY->GET_MTART( ).
        P_MATKL = GO_MATERIAL_KEY->GET_MATKL( ).
        WRITE : / '物料号:',P_MATNR.
        WRITE : / '物料描述:',P_MAKTX.
        WRITE : / '创建日期:',P_ERSDA.
        WRITE : / '物料类型:',P_MTART.
        WRITE : / '物料组:',P_MATKL.
      CATCH CX_OS_OBJECT_NOT_FOUND.
        MESSAGE 'Oject does not exist.' TYPE 'E'.
    ENDTRY.

  ELSEIF P_CRE = 'X'.

    TRY.
        "调用操作类,查询数据库中是否存在持久化记录
        CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
          EXPORTING
            I_MATNR = P_MATNR
          RECEIVING
            RESULT  = GO_RESULT_OBJ.
      CATCH CX_OS_OBJECT_NOT_FOUND .
    ENDTRY.
    IF GO_RESULT_OBJ IS BOUND.
      MESSAGE 'Oject already exist.' TYPE 'E'.
    ENDIF.
    TRY.
        "调用操作类,创建持久化类的属性和主键记录到数据库表
        CALL METHOD GO_MATERIAL_AGENT->CREATE_PERSISTENT
          EXPORTING
            I_MATNR = P_MATNR
            I_MAKTX = P_MAKTX
            I_ERSDA = P_ERSDA
            I_MTART = P_MTART
            I_MATKL = P_MATKL
          RECEIVING
            RESULT  = GO_MATERIAL_KEY.
        COMMIT WORK.
        WRITE : / 'Object Created.'.
      CATCH CX_OS_OBJECT_EXISTING .
        MESSAGE 'Oject already exist.' TYPE 'E'.
    ENDTRY.

  ELSEIF P_DEL = 'X'.

    TRY.
        "调用操作类,查询数据库中是否存在持久化记录
        CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
          EXPORTING
            I_MATNR = P_MATNR
          RECEIVING
            RESULT  = GO_RESULT_OBJ.
      CATCH CX_OS_OBJECT_NOT_FOUND .
        MESSAGE 'Oject does not exist.' TYPE 'E'.
    ENDTRY.
    GO_MATERIAL_KEY ?= GO_RESULT_OBJ.
    TRY.
        "调用操作类,按主键删除持久化记录
        CALL METHOD GO_MATERIAL_AGENT->DELETE_PERSISTENT
          EXPORTING
            I_MATNR = P_MATNR.
        COMMIT WORK.
        WRITE : / 'Object Deleted.'.
      CATCH CX_OS_OBJECT_NOT_EXISTING .
        MESSAGE 'Oject does not exist.' TYPE 'E'.
    ENDTRY.

  ENDIF.

以上是关于学习笔记持久类和对象持久化的应用的主要内容,如果未能解决你的问题,请参考以下文章

JavaEE学习笔记之SSH—Hibernate

ODB学习笔记之基础环境搭建

Hibernate学习笔记

Hibernate 学习笔记

持久片段和查看器

持久化存储——偏好设置,plist,归档---学习笔记二