📄 collections.html
字号:
</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><tr><td width="5%" valign="top" align="left">(8)</td><td valign="top" align="left"><p> <tt class="literal">property-ref</tt>: (可选) 被关联到此外键(foreign key)的类中的对应属性的名字。若未指定,使用被关联类的主键。 </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"/> <list-index column="sortOrder"/> <many-to-many column="addressId" class="Address"/></array></pre><p> 一个map,通过字符串的索引来指明日期: </p><pre class="programlisting"><map name="holidays" table="holidays" schema="dbo" order-by="hol_name asc"> <key column="id"/> <map-key column="hol_name" type="string"/> <element column="hol_date" type="date"/></map></pre><p> 一个组件的列表:(下一章讨论) </p><pre class="programlisting"><list name="carComponents" table="CarComponents"> <key column="carId"/> <list-index column="sortOrder"/> <composite-element class="CarComponent"> <property name="price"/> <property name="type"/> <property name="serialNumber" column="serialNum"/> </composite-element></list></pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-onetomany"></a>6.2.5. 一对多关联(One-to-many Associations)</h3></div></div><div></div></div><p> <span class="emphasis"><em>一对多关联</em></span><span class="emphasis"><em>通过外键</em></span>连接两个类对应的表,而没有中间集合表。 这个关系模型失去了一些Java集合的语义: </p><div class="itemizedlist"><ul type="disc" compact><li><p> 一个被包含的实体的实例只能被包含在一个集合的实例中 </p></li><li><p> 一个被包含的实体的实例只能对应于集合索引的一个值中 </p></li></ul></div><p> 一个从<tt class="literal">Product</tt>到<tt class="literal">Part</tt>的关联需要关键字字段,可能还有一个索引字段指向<tt class="literal">Part</tt>所对应的表。 <tt class="literal"><one-to-many></tt>标记指明了一个一对多的关联。 </p><div class="programlistingco"><pre class="programlisting"><one-to-many class="ClassName" <span class="co">(1)</span> not-found="ignore|exception" <span class="co">(2)</span> entity-name="EntityName" <span class="co">(3)</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">class</tt>(必须):被关联类的名称。 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</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">(3)</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="bars"> <key column="foo_id"/> <one-to-many class="org.hibernate.Bar"/></set></pre><p> 注意:<tt class="literal"><one-to-many></tt>元素不需要定义任何字段。 也不需要指定表名。 </p><p> <span class="emphasis"><em>重要提示</em></span>:如果<tt class="literal">一对多</tt>关联中的外键字段定义成<tt class="literal">NOT NULL</tt>,你必须把<tt class="literal"><key></tt>映射声明为<tt class="literal">not-null="true"</tt>,或者使用<span class="emphasis"><em>双向关联</em></span>,并且标明<tt class="literal">inverse="true"</tt>。参阅本章后面关于双向关联的讨论。 </p><p> 下面的例子展示一个<tt class="literal">Part</tt>实体的map,把name作为关键字。( <tt class="literal">partName</tt> 是<tt class="literal">Part</tt>的持久化属性)。注意其中的基于公式的索引的用法。 </p><pre class="programlisting"><map name="parts" cascade="all"> <key column="productId" not-null="true"/> <map-key formula="partName"/> <one-to-many class="Part"/></map></pre></div></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-advancedmappings"></a>6.3. 高级集合映射(Advanced collection mappings)</h2></div></div><div></div></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-sorted"></a>6.3.1. 有序集合(Sorted collections)</h3></div></div><div></div></div><p> Hibernate支持实现<tt class="literal">java.util.SortedMap</tt>和<tt class="literal">java.util.SortedSet</tt>的集合。你必须在映射文件中指定一个比较器: </p><pre class="programlisting"><set name="aliases" table="person_aliases" sort="natural"> <key column="person"/> <element column="name" type="string"/></set>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -