collections.html
来自「是一个中文的Hibernate库文档」· HTML 代码 · 共 521 行 · 第 1/5 页
HTML
521 行
<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>7.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>7.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>7.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><map name="holidays" sort="my.custom.HolidayComparator"> <key column="year_id"/> <map-key column="hol_name" type="string"/> <element column="hol_date" type="date"/></map></pre><p> <tt class="literal">sort</tt>属性中允许的值包括<tt class="literal">unsorted</tt>,<tt class="literal">natural</tt>和某个实现了<tt class="literal">java.util.Comparator</tt>的类的名称。 </p><p> 分类集合的行为事实上象<tt class="literal">java.util.TreeSet</tt>或者<tt class="literal">java.util.TreeMap</tt>。 </p><p> 如果你希望数据库自己对集合元素排序,可以利用<tt class="literal">set</tt>,<tt class="literal">bag</tt>或者<tt class="literal">map</tt>映射中的<tt class="literal">order-by</tt>属性。这个解决方案只能在jdk1.4或者更高的jdk版本中才可以实现(通过LinkedHashSet或者LinkedHashMap实现)。 它是在SQL查询中完成排序,而不是在内存中。 </p><pre class="programlisting"><set name="aliases" table="person_aliases" order-by="lower(name) asc"> <key column="person"/> <element column="name" type="string"/></set><map name="holidays" order-by="hol_date, hol_name"> <key column="year_id"/> <map-key column="hol_name" type="string"/> <element column="hol_date" type="date"/></map></pre><p> 注意: 这个<tt class="literal">order-by</tt>属性的值是一个SQL排序子句而不是HQL的! </p><p> 关联还可以在运行时使用集合<tt class="literal">filter()</tt>根据任意的条件来排序。 </p><pre class="programlisting">sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();</pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-bidirectional"></a>7.3.2. 双向关联(Bidirectional associations)</h3></div></div><div></div></div><p> <span class="emphasis"><em>双向关联</em></span>允许通过关联的任一端访问另外一端。在Hibernate中, 支持两种类型的双向关联: </p><div class="variablelist"><dl><dt><span class="term">一对多(one-to-many)</span></dt><dd><p> Set或者bag值在一端, 单独值(非集合)在另外一端 </p></dd><dt><span class="term">多对多(many-to-many)</span></dt><dd><p> 两端都是set或bag值 </p></dd></dl></div><p> </p><p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?