📄 collections.html
字号:
<tt class="literal">sort</tt>(可选)指定集合的排序顺序, 其可以为自然的(<tt class="literal">natural</tt>)或者给定一个用来比较的类。 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/8.png" alt="8" border="0"></td><td valign="top" align="left"><p> <tt class="literal">order-by</tt> (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/9.png" alt="9" border="0"></td><td valign="top" align="left"><p> <tt class="literal">where</tt> (可选) 指定任意的SQL where条件, 该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用) </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/10.png" alt="10" border="0"></td><td valign="top" align="left"><p> <tt class="literal">outer-join</tt>(可选)指定这个集合,只要可能,应该通过外连接(outer join)取得。在每一个SQL语句中, 只能有一个集合可以被通过外连接抓取(译者注: 这里提到的SQL语句是取得集合所属类的数据的Select语句) </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></table></div></div><p> 建立<tt class="literal">列表(List)</tt>和<tt class="literal">数组(Array)</tt>需要一个单独表字段用来保存列表(List)或数组(Array)的索引(<tt class="literal">foo[i]</tt>中的<tt class="literal">i</tt>)。如果你的关系模型中没有一个索引字段, 例如:如果你处理的是老式的遗留数据, 你可以用无序的<tt class="literal">Set</tt>来替代。这会让那些以为<tt class="literal">List</tt>应该是访问无序集合的比较方便的方法的人感到气馁。Hibernate集合严格遵守Set,List和Map接口中包涵的自然语义。 <tt class="literal">List</tt>元素不能正确的自发对他们自己进行排序! </p><p> 在另一方面, 那些准备使用<tt class="literal">List</tt>来模拟<span class="emphasis"><em>bag</em></span>的语义的人有一个合法的委屈(a legitimate grievance)。bag是一个无序,没有索引的集合并且可能包含多个相同的元素。在Java集合框架中没有<tt class="literal">Bag</tt>接口(虽然你可以用List模拟它)。Hibernate允许你映射类型为<tt class="literal">List</tt>或者<tt class="literal">Collection</tt>的属性到<tt class="literal"><bag></tt>元素。注意: Bag语义事实上并不是Collection规范(contract)的一部分并且事实上它和<tt class="literal">List</tt>规范中的语义是相矛盾的。 </p><p> 具有<tt class="literal">inverse="false"</tt>标记的大型Hibernate bag效率是相当低的,应该尽量避免。Hibernate无法创建,删除和更新它的单个记录, 因为他们没有关键字来识别单个记录。 </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-s1-5"></a>6.3. 值集合和多对多关联(Collections of Values and Many To Many Associations)</h2></div></div><div></div></div><p> 任何值集合和实体集合如果被映射为多对多关联(Java集合中的语义)就需要一个集合表。这个表中包含外键字段,元素字段还可能有索引字段。 </p><p> 使用<tt class="literal"><key></tt>元素来申明从集合表到其拥有者类的表(from the collection table to the table of the owning class)的外键关键字。 </p><div class="programlistingco"><pre class="programlisting"><key column="column_name"/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/1.png" alt="1" border="0"></td><td valign="top" align="left"><p> <tt class="literal">column</tt>(必需):外键字段的名称 </p></td></tr></table></div></div><p> 对于类似与map和list的带索引的集合, 我们需要一个<tt class="literal"><index></tt>元素。对于list来说, 这个字段包含从零开始的连续整数。对于map来说,这个字段可以包含任意Hibernate类型的值。 </p><div class="programlistingco"><pre class="programlisting"><index column="column_name" <span class="co"><img src="../images/callouts/1.png" alt="(1)"></span> type="typename" <span class="co"><img src="../images/callouts/2.png" alt="(2)"></span>/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/1.png" alt="1" border="0"></td><td valign="top" align="left"><p> <tt class="literal">column</tt>(必需):保存集合索引值的字段名。 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/2.png" alt="2" border="0"></td><td valign="top" align="left"><p> <tt class="literal">type</tt> (可选,默认为整型<tt class="literal">integer</tt>):集合索引的类型。 </p></td></tr></table></div></div><p> 还有另外一个选择,map可以是实体类型的对象。在这里我们使用<tt class="literal"><index-many-to-many></tt>元素。 </p><div class="programlistingco"><pre class="programlisting"><index-many-to-many column="column_name" <span class="co"><img src="../images/callouts/1.png" alt="(1)"></span> class="ClassName" <span class="co"><img src="../images/callouts/2.png" alt="(2)"></span>/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/1.png" alt="1" border="0"></td><td valign="top" align="left"><p> <tt class="literal">column</tt>(必需):集合索引值中外键字段的名称 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/2.png" alt="2" border="0"></td><td valign="top" align="left"><p> <tt class="literal">class</tt> (required):(必需):集合的索引使用的实体类。 </p></td></tr></table></div></div><p> 对于一个值集合, 我们使用<tt class="literal"><element></tt>标签。 </p><div class="programlistingco"><pre class="programlisting"><element column="column_name" <span class="co"><img src="../images/callouts/1.png" alt="(1)"></span> type="typename" <span class="co"><img src="../images/callouts/2.png" alt="(2)"></span>/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/1.png" alt="1" border="0"></td><td valign="top" align="left"><p> <tt class="literal">column</tt>(必需):保存集合元素值的字段名。 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/2.png" alt="2" border="0"></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)关联</em></span>关系概念。多对多关联是针对Java集合的最自然映射关联关系,但通常并不是最好的关系模型。 </p><div class="programlistingco"><pre class="programlisting"><many-to-many column="column_name" <span class="co"><img src="../images/callouts/1.png" alt="(1)"></span> class="ClassName" <span class="co"><img src="../images/callouts/2.png" alt="(2)"></span> outer-join="true|false|auto" <span class="co"><img src="../images/callouts/3.png" alt="(3)"></span>/></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/1.png" alt="1" border="0"></td><td valign="top" align="left"><p> <tt class="literal">column</tt>(必需): 这个元素的外键关键字段名 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/2.png" alt="2" border="0"></td><td valign="top" align="left"><p> <tt class="literal">class</tt> (必需): 关联类的名称 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/3.png" alt="3" border="0"></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></table></div></div><p> 例子: </p><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="SIZES" order-by="SIZE ASC"> <key column="OWNER"/> <element column="SIZE" type="integer"/></bag></pre><p> 一个实体数组,在这个案例中是一个多对多的关联(注意这里的实体是自动管理生命周期的对象(lifecycle objects),<tt class="literal">cascade="all"</tt>): </p><pre class="programlisting"><array name="foos" table="BAR_FOOS" cascade="all"> <key column="BAR_ID"/> <index column="I"/> <many-to-many column="FOO_ID" class="com.illflow.Foo"/></array></pre><p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -