collections.html
来自「是一个中文的Hibernate库文档」· HTML 代码 · 共 521 行 · 第 1/5 页
HTML
521 行
在外键字段上可能具有非空约束。对于大多数集合来说,这是隐含的。对单向一对多关联来说,外键字段默认是可以为空的,因此你可能需要指明 <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>7.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>7.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> (可选,默认为整型<tt class="literal">integer</tt>):集合索引的类型。 </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> (必需):集合的索引使用的实体类。 </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>7.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="N" precision="N" scale="N" 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> 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.) </p></td></tr><tr><td width="5%" valign="top" align="left">(6)</td><td valign="top" align="left"><p> <tt class="literal">not-found</tt> (可选 - 默认为 <tt class="literal">exception</tt>): 指明引用的外键中缺少某些行该如何处理: <tt class="literal">ignore</tt> 会把缺失的行作为一个空引用处理。 </p></td></tr><tr><td width="5%" valign="top" align="left">(7)</td><td valign="top" align="left"><p> <tt class="literal">entity-name</tt> (可选): 被关联的类的实体名,作为<tt class="literal">class</tt>的替代。 </p></td></tr></table></div></div><p> 例子:首先, 一组字符串: </p><pre class="programlisting"><set name="names" table="NAMES"> <key column="GROUPID"/> <element column="NAME" type="string"/></set></pre><p> 包含一组整数的bag(还设置了<tt class="literal">order-by</tt>参数指定了迭代的顺序): </p><pre class="programlisting"><bag name="sizes" table="item_sizes" order-by="size asc"> <key column="item_id"/> <element column="size" type="integer"/></bag></pre><p> 一个实体数组,在这个案例中是一个多对多的关联(注意这里的实体是自动管理生命周期的对象(lifecycle objects),<tt class="literal">cascade="all"</tt>): </p><pre class="programlisting"><array name="addresses" table="PersonAddress" cascade="persist"> <key column="personId"/>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?