文章
· 八月 15, 2021 阅读大约需 4 分钟

属性关键字OnDelete,Private,ReadOnly,Required

第105章 属性关键字 - OnDelete

指定删除相关对象时在当前表中采取的操作。此关键字仅适用于将基数Cardinality 指定为“父”或“一”的关系属性。它的使用在所有其他上下文中都是无效的。

用法

要指定删除相关对象时在当前表中采取的操作,请使用以下语法:

Relationship relname As classname [ Cardinality = cardinality, Inverse = inverse, OnDelete = ondelete ];

其中ondelete是以下值之一。在本讨论中,相关记录是属于关系另一方的记录或对象,引用记录是关系这一方的记录或对象。

  • cascade级联—删除相关记录时,也会删除该表中的引用记录。
  • noaction无操作—当试图删除相关记录时,尝试会失败。
  • setdefault —删除相关记录时,该表中的引用记录将被设置为其默认值。
  • setnull —删除相关记录时,该表中的引用记录将被设置为null

详解

此关键字定义了在关系的另一端删除记录时发生的引用操作。

默认

如果忽略此关键字,则:
- 对于Cardinality 基数为父的关系,OnDelete是级联的。也就是说,当删除父记录时,默认情况下,关联的子记录将被删除。
- 对于基数为1的关系,OnDeletenoaction。也就是说,当试图删除“一个”记录时,默认情况下,如果另一个表有任何指向它的记录,尝试就会失败。

示例

Class MyApp.Employee Extends %Persistent {  
...
Relationship Employer As MyApp.Company [ Cardinality = one, Inverse = Employees, OnDelete = cascade ];
}

这个例子显示了公司和员工之间的一对多关系。
如图所示,Cardinality表示公司是关系的“one”,而OnDelete表示删除公司对其员工的影响。
由于OnDelete的值是cascade,当删除一个公司时,它的效果是级联的,员工也会被删除。

第106章 属性关键字 - Private

指定属性是否私有(只能由该类或其子类的方法使用)。

用法

要指定属性为私有,请使用以下语法:

Property name As classname [ Private ];

否则,忽略该关键字或将Not放在该关键字之前。

详解

私有类成员只能由该类(或其子类)的方法使用。

在目录信息中不显示私有属性,并且不是由SELECT *查询返回的。
但是,可以在SQL查询中显式地引用和使用私有属性。

子类继承Private关键字的值,不能重写它。

在IRIS中,私有属性总是被继承的,并且对定义属性的类的子类可见;其他语言经常调用这些受保护的属性。

默认

如果省略此关键字,则此属性不是私有的。

第107章 属性关键字 - ReadOnly

指定属性是只读的,这限制了其值的设置方式。

用法

要指定属性为只读,请使用以下语法:

Property name As classname [ ReadOnly ];

否则,省略此关键字或将单词Not放在关键字的前面。

重要提示:不要在集合属性中使用ReadOnly关键字。

详解

此关键字指定不能通过使用对象引用来设置该属性的值。如果使用对象引用设置只读属性的值,例如:

set oref.Name = "newvalue"

那么在运行时会出现<CANNOT SET THIS PROPERTY>错误。

同样,当属性被定义为只读时,相应的SQL表中的字段也被定义为只读。不能通过SQL语句显式插入或更新只读字段。尝试这样做将导致SQL错误,SQLCODE-138

可以通过以下方式指定只读属性的值:
- 通过InitialExpression关键字。
- 通过SQLComputeCode关键字。

请注意,这些技术都有特定的限制。

注意

如果属性被标记为只读和必需 required,请注意对象访问和SQL访问之间的以下行为差异:
- 当保存对象时, IRIS不会验证属性。这意味着 IRIS忽略了该属性的Required关键字。
- 当插入或更新记录时, IRIS会属性的Required关键字。

默认

如果省略此关键字,则属性不是只读的。

第108章 属性关键字 - Required

对于持久性类,指定属性的值必须先给定一个值,然后才能存储到磁盘。对于启用了XML的类,指定属性映射到的元素是必需的。

用法

要指定属性是必需required的,请使用以下语法:

Property name As classname [ Required ];

否则,省略此关键字或将单词Not放在关键字的前面。

详解

对于持久类,此关键字指定在包含对象可以存储到磁盘之前,必须给属性一个值;如果属性没有值,则会发生错误。

  • 如果属性的类型为%Stream,则流不能为空流。也就是说,如果%IsNull()方法返回0,则认为流属性具有值。
  • 对于扩展%XML.Adaptor的类,此关键字影响相应的XML架构。如果属性被标记为REQUIRED,则模式中的相应元素没有minOccurs=“0”,因此被认为是必需的。

在子类中,可以将可选属性标记为必需,但不能反之亦然。

注意

如果属性被标记为只读和必需 required,请注意对象访问和SQL访问之间的以下行为差异:
- 当保存对象时, IRIS不会验证属性。这意味着 IRIS忽略了该属性的Required关键字。
- 当插入或更新记录时, IRIS会属性的Required关键字。

默认

如果省略此关键字,则不需要该属性。

讨论 (0)1
登录或注册以继续