为了解释这一点,我将从 doc 中的另一个示例开始:
代码 sn -p 显示字符串集合的映射:
<set name="aliases"
table="person_aliases"
sort="natural">
<key column="person"/>
<element column="name" type="string"/>
</set>
在这种情况下,我们确实有一个 aliases 集合,表示为 List<string>,映射到 <element>。
我们可以清楚地看到,这里的每个元素(alias)都是一个string - Value Type(与Reference类型的含义相反)。我们也没有想到,系统中可能还有其他位置,引用这个元素...
因为它不是 参考类型。
现在,让我们转到:
我们看到的是一个例子,(非常)类似,但不是<element>,而是使用<composite-element>:
<set name="purchasedItems" table="purchase_items" lazy="true">
<key column="order_id">
<composite-element class="eg.Purchase">
<property name="purchaseDate"/>
<property name="price"/>
<property name="quantity"/>
<many-to-one name="item" class="eg.Item"/> <!-- class attribute is optional -->
</composite-element>
</set>
而对于 string,我们在 Java 中有相关的对象 (string) - 对于上述构造,我们确实需要自定义类型。那就是class Pruchase {}
但即使这是一个自定义类型——我们自己的类,在这种情况下它也被表示为一个值类型(再次,与引用类型相反)。
为什么?因为它没有任何 id,任何键 - 被引用。它是从领域建模的角度构建的。也许doc 的引用可以提供更多帮助:
与值类型一样,组件不支持共享引用。换句话说,两个人可以有相同的名字,但是两个人对象将包含两个独立的名字对象,它们的值只是“相同”。
最后:
这是一项功能。我们可以使用<composite-element> 和<element> 的事实并不意味着我们必须。我们仍然可以通过将 Purchase 类映射为<class> 将其转换为一级公民。然后所有标准的东西都会再次起作用——因为它代表了一个引用类型...