InterSystems ObjectScript:能否在持久化类中创建非持久化属性且不随%Save()保存?
在InterSystems ObjectScript持久化类中创建非持久化属性的实现
当然可以!在InterSystems ObjectScript的持久化类体系里,你完全能创建不会随%Save()方法执行而被保存到数据库的非持久化属性,这在很多业务场景中都非常实用——比如存储临时计算结果、缓存中间处理数据,或者用来承载不需要持久化的辅助信息。
具体实现方法
只需要给目标属性添加[NotPersistent]关键字修饰即可,这个标记会告诉ObjectScript引擎:该属性不需要参与持久化流程。
代码示例
Class Sample.Person Extends %Persistent { /// 持久化到数据库的姓名属性 Property Name As %String; /// 持久化到数据库的年龄属性 Property Age As %Integer; /// 非持久化属性:不会被%Save()保存 Property FullNameDisplay As %String [ NotPersistent ]; /// 计算并设置FullNameDisplay的方法 Method GenerateDisplayText() { Set ..FullNameDisplay = ..Name _ ",年龄:"_ ..Age } }
效果验证
当你创建这个类的实例并操作时:
- 给
Name和Age赋值,调用GenerateDisplayText()生成FullNameDisplay的值 - 执行
%Save()方法后,数据库中只会存储Name和Age字段,FullNameDisplay不会被写入 - 后续从数据库加载该实例时,
FullNameDisplay会回到属性的默认值(比如空字符串),需要重新调用方法生成或手动赋值
补充说明
除了[NotPersistent],还有[Transient]关键字也能实现类似效果。不过[NotPersistent]的语义更聚焦于“不参与持久化”,而[Transient]还会影响对象的序列化行为。如果你的需求只是避免属性被保存到数据库,推荐使用[NotPersistent]来明确表达意图。
内容的提问来源于stack exchange,提问作者Vivek Ranjan
相关产品推荐
相关产品推荐

