📄 collections.html
字号:
</p></td></tr><tr><td width="5%" valign="top" align="left">(11)</td><td valign="top" align="left"><p> <tt class="literal">batch-size</tt> (可选, 默认为<tt class="literal">1</tt>) 指定通过延迟加载取得集合实例的批处理块大小("batch size")。 </p></td></tr><tr><td width="5%" valign="top" align="left">(12)</td><td valign="top" align="left"><p> <tt class="literal">access</tt>(可选-默认为属性property):Hibernate取得集合属性值时使用的策略 </p></td></tr><tr><td width="5%" valign="top" align="left">(13)</td><td valign="top" align="left"><p> <tt class="literal">乐观锁</tt> (可选 - 默认为 <tt class="literal">true</tt>): 对集合的状态的改变会是否导致其所属的实体的版本增长。 (对一对多关联来说,关闭这个属性常常是有理的) </p></td></tr><tr><td width="5%" valign="top" align="left">(14)</td><td valign="top" align="left"><p> <tt class="literal">mutable(可变)</tt> (可选 - 默认为<tt class="literal">true</tt>): 若值为<tt class="literal">false</tt>,表明集合中的元素不会改变(在某些情况下可以进行一些小的性能优化)。 </p></td></tr></table></div></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-foreignkeys"></a>6.2.1. 集合外键(Collection foreign keys)</h3></div></div><div></div></div><p> 集合实例在数据库中依靠持有集合的实体的外键加以辨别。此外键作为<span class="emphasis"><em>集合关键字段(collection key column)</em></span>(或多个字段)加以引用。集合关键字段通过<tt class="literal"><key></tt> 元素映射。 </p><p> 在外键字段上可能具有非空约束。对于大多数集合来说,这是隐含的。对单向一对多关联来说,外键字段默认是可以为空的,因此你可能需要指明 <tt class="literal">not-null="true"</tt>。 </p><pre class="programlisting"><key column="productSerialNumber" not-null="true"/></pre><p> 外键约束可以使用<tt class="literal">ON DELETE CASCADE</tt>。 </p><pre class="programlisting"><key column="productSerialNumber" on-delete="cascade"/></pre><p> 对<tt class="literal"><key></tt> 元素的完整定义,请参阅前面的章节。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-elements"></a>6.2.2. 集合元素(Collection elements)</h3></div></div><div></div></div><p> 集合几乎可以包含任何其他的Hibernate类型,包括所有的基本类型、自定义类型、组件,当然还有对其他实体的引用。存在一个重要的区别:位于集合中的对象可能是根据“值”语义来操作(其声明周期完全依赖于集合持有者),或者它可能是指向另一个实体的引用,具有其自己的生命周期。在后者的情况下,被作为集合持有的状态考虑的,只有两个对象之间的“连接”。 </p><p> 被包容的类型被称为<span class="emphasis"><em>集合元素类型(collection element type)</em></span>。集合元素通过<tt class="literal"><element></tt>或<tt class="literal"><composite-element></tt>映射,或在其是实体引用的时候,通过<tt class="literal"><one-to-many></tt> 或<tt class="literal"><many-to-many></tt>映射。前两种用于使用值语义映射元素,后两种用于映射实体关联。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-indexed"></a>6.2.3. 索引集合类(Indexed collections)</h3></div></div><div></div></div><p> 所有的集合映射,除了set和bag语义的以外,都需要指定一个集合表的<span class="emphasis"><em>索引字段(index column)</em></span>——用于对应到数组索引,或者<tt class="literal">List</tt>的索引,或者<tt class="literal">Map</tt>的关键字。通过<tt class="literal"><map-key></tt>,<tt class="literal">Map</tt> 的索引可以是任何基础类型;若通过<tt class="literal"><map-key-many-to-many></tt>,它也可以是一个实体引用;若通过<tt class="literal"><composite-map-key></tt>,它还可以是一个组合类型。数组或列表的索引必须是<tt class="literal">integer</tt>类型,并且使用 <tt class="literal"><list-index></tt>元素定义映射。被映射的字段包含有顺序排列的整数(默认从0开始)。 </p><div class="programlistingco"><pre class="programlisting"><map-key column="column_name" <span class="co">(1)</span> formula="any SQL expression" <span class="co">(2)</span> type="type_name" <span class="co">(3)</span> node="@attribute-name" length="N"/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left">(1)</td><td valign="top" align="left"><p> <tt class="literal">column</tt>(可选):保存集合索引值的字段名。 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</td><td valign="top" align="left"><p> <tt class="literal">formula</tt> (可选): 用于计算map关键字的SQL公式 </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</td><td valign="top" align="left"><p> <tt class="literal">type</tt> (必须):映射键(map key)的类型。 </p></td></tr></table></div></div><div class="programlistingco"><pre class="programlisting"><map-key-many-to-many column="column_name" <span class="co">(1)</span> formula="any SQL expression" <span class="co">(2)</span><span class="co">(3)</span> class="ClassName"/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left">(1)</td><td valign="top" align="left"><p> <tt class="literal">column</tt>(可选):集合索引值中外键字段的名称 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</td><td valign="top" align="left"><p> <tt class="literal">formula</tt> (可选): 用于计算map关键字的外键的SQL公式 </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</td><td valign="top" align="left"><p> <tt class="literal">class</tt> (必需):映射的键(map key)使用的实体类。 </p></td></tr></table></div></div><p> 假若你的表没有一个索引字段,当你仍然希望使用<tt class="literal">List</tt>作为属性类型,你应该把此属性映射为Hibernate <span class="emphasis"><em><bag></em></span>。从数据库中获取的时候,bag不维护其顺序,但也可选择性的进行排序。 </p></div><p> 从集合类可以产生很大一部分映射,覆盖了很多常见的关系模型。我们建议你试验schema生成工具,来体会一下不同的映射声明是如何被翻译为数据库表的。 </p><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-ofvalues"></a>6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations)</h3></div></div><div></div></div><p> 任何值集合或者多对多关联需要专用的具有一个或多个外键字段的<span class="emphasis"><em>collection table</em></span>、一个或多个<span class="emphasis"><em>collection element column</em></span>,以及还可能有一个或多个索引字段。 </p><p> 对于一个值集合, 我们使用<tt class="literal"><element></tt>标签。 </p><div class="programlistingco"><pre class="programlisting"><element column="column_name" <span class="co">(1)</span> formula="any SQL expression" <span class="co">(2)</span> type="typename" <span class="co">(3)</span> length="L" precision="P" scale="S" not-null="true|false" unique="true|false" node="element-name"/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left">(1)</td><td valign="top" align="left"><p> <tt class="literal">column</tt>(可选):保存集合元素值的字段名。 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</td><td valign="top" align="left"><p> <tt class="literal">formula</tt> (可选): 用于计算元素的SQL公式 </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</td><td valign="top" align="left"><p> <tt class="literal">type</tt> (必需):集合元素的类型 </p></td></tr></table></div></div><p> <span class="emphasis"><em>多对多关联(many-to-many association)</em></span> 使用 <tt class="literal"><many-to-many></tt>元素定义. </p><div class="programlistingco"><pre class="programlisting"><many-to-many column="column_name" <span class="co">(1)</span> formula="any SQL expression" <span class="co">(2)</span> class="ClassName" <span class="co">(3)</span> fetch="select|join" <span class="co">(4)</span> unique="true|false" <span class="co">(5)</span> not-found="ignore|exception" <span class="co">(6)</span> entity-name="EntityName" <span class="co">(7)</span> property-ref="propertyNameFromAssociatedClass" <span class="co">(8)</span> node="element-name" embed-xml="true|false" /></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left">(1)</td><td valign="top" align="left"><p> <tt class="literal">column</tt>(可选): 这个元素的外键关键字段名 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</td><td valign="top" align="left"><p> <tt class="literal">formula</tt> (可选): 用于计算元素外键值的SQL公式. </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</td><td valign="top" align="left"><p> <tt class="literal">class</tt> (必需): 关联类的名称 </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</td><td valign="top" align="left"><p> <tt class="literal">outer-join</tt> (可选 - 默认为<tt class="literal">auto</tt>): 在Hibernate系统参数中<tt class="literal">hibernate.use_outer_join</tt>被打开的情况下,该参数用来允许使用outer join来载入此集合的数据。 </p></td></tr><tr><td width="5%" valign="top" align="left">(4)</td><td valign="top" align="left"><p> 为此关联打开外连接抓取或者后续select抓取。这是特殊情况;对于一个实体及其指向其他实体的多对多关联进全预先抓取(使用一条单独的<tt class="literal">SELECT</tt>),你不仅需要对集合自身打开<tt class="literal">join</tt>,也需要对<tt class="literal"><many-to-many></tt>这个内嵌元素打开此属性。 </p></td></tr><tr><td width="5%" valign="top" align="left">(5)</td><td valign="top" align="left"><p> 对外键字段允许DDL生成的时候生成一个惟一约束。这使关联变成了一个高效的一对多关联。(此句存疑:原文为This makes the association multiplicity effectively one to many.)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -