第105章 属性关键字 - OnDelete
指定删除相关对象时在当前表中采取的操作。此关键字仅适用于将基数Cardinality
指定为“父”或“一”的关系属性。它的使用在所有其他上下文中都是无效的。
用法
要指定删除相关对象时在当前表中采取的操作,请使用以下语法:
Relationship relname As classname [ Cardinality = cardinality, Inverse = inverse, OnDelete = ondelete ];
其中ondelete
是以下值之一。在本讨论中,相关记录是属于关系另一方的记录或对象,引用记录是关系这一方的记录或对象。
cascade
级联—删除相关记录时,也会删除该表中的引用记录。noaction
无操作—当试图删除相关记录时,尝试会失败。setdefault
—删除相关记录时,该表中的引用记录将被设置为其默认值。setnull
—删除相关记录时,该表中的引用记录将被设置为null
。
详解
此关键字定义了在关系的另一端删除记录时发生的引用操作。
默认
如果忽略此关键字,则:
- 对于Cardinality
基数为父的关系,OnDelete
是级联的。也就是说,当删除父记录时,默认情况下,关联的子记录将被删除。
- 对于基数为1的关系,OnDelete
为noaction
。也就是说,当试图删除“一个”记录时,默认情况下,如果另一个表有任何指向它的记录,尝试就会失败。
示例
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
关键字。
默认
如果省略此关键字,则不需要该属性。