为了解释这一点,我将从文档中的另一个示例开始:
- 7.3.1。排序的集合
代码段显示了字符串集合的映射:
<set name="aliases" table="person_aliases" sort="natural"> <key column="person"/> <element column="name" type="string"/></set>
在这种情况下,我们确实有一个集合 aliases
,用a表示
List<string>,并映射为
<element>。
我们可以清楚地看到,这里的每个元素 (别名) 都是
string-值类型 (与Reference类型相反)
。我们也没有想到,有可能是系统中的任何进一步的地方, 引用 这个元素......
因为它 不是 一个 Refeence类型 。
现在,让我们转到:
- 9.2。依赖对象的集合
我们看到的是一个 (非常) 相似的示例,但不是
<element>使用,而是使用了
<composite-element>:
<set name="purchasedItems" table="purchase_items" lazy="true"> <key column="order_id"> <composite-element > <property name="purchaseDate"/> <property name="price"/> <property name="quantity"/> <many-to-one name="item" /> <!-- class attribute is optional --> </composite-element></set>
虽然对于 string
Java我们有相关的对象 (字符串) -对于上述构造,我们确实需要自定义类型。那将是一个
classPruchase {}但是,即使这是一个自定义类型(我们自己的类),在这种情况下,它仍表示为值类型 (同样,与引用类型相反) 。
为什么?因为它没有任何ID,所以要引用任何密钥。它是从Domain建模的角度构造的。也许该文档中的引用可以提供更多帮助:
像值类型一样,组件不支持共享引用。换句话说,两个人可能具有相同的名称,但是两个人对象将包含两个独立的名称对象,它们的值仅“相同”。
最后:
这是一个功能。我们可以使用
<composite-element>和的事实
<element>并不意味着我们必须这样做。通过将其映射为,我们仍然可以将
Purchase 类转换为第一级公民
<class>。然后所有标准的东西将再次起作用-因为它将代表 引用类型 …



