📄 collections.html
字号:
<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></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-s1-8b"></a>6.7. 对collection排序的其他方法(Other Ways To Sort a Collection)</h2></div></div><div></div></div><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="name asc"> <key column="person"/> <element column="name" type="string"/></set><map name="holidays" order-by="hol_date, hol_name" lazy="true"> <key column="year_id"/> <index 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.filter( group.getUsers(), "order by this.name" );</pre></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-s1-9"></a>6.8. 垃圾收集(Garbage Collection)</h2></div></div><div></div></div><p> 集合是在被持久对象引用时自动持久化,并且不再不引用时自动删除的。 如果集合被从一个持久化对象转移到另外一个, 他的数据可能会被从一个表移到另外一个。 你不需要担心这些。 就跟你通常使用java集合一样使用Hibernate集合即可。 </p><p> <span class="emphasis"><em>注意:</em></span>上面的论断在<tt class="literal">inverse="true"</tt>的情况下<span class="emphasis"><em>不</em></span>适用。 我们将在接下来的章节中解释这一点。 </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-s1-10"></a>6.9. 双向关联(Bidirectional Associations)</h2></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> 请注意Hibernate不支持带有索引的集合(list,map或者array)作为"多"的那一端的双向one-to-many关联。 </p><p> 要建立一个双向的多对多关联,只需要映射两个many-to-many关联到同一个数据库表中,并再定义其中的一端为<span class="emphasis"><em>inverse</em></span>。这里有一个从一个类关联到<span class="emphasis"><em>他自身</em></span>的many-to-many的双向关联的例子: (原文:You may specify a bidirectional many-to-many association simply by mapping two many-to-many associations to the same database table and declaring one end as <span class="emphasis"><em>inverse</em></span>. Heres an example of a bidirectional many-to-many association from a class back to <span class="emphasis"><em>itself</em></span>:) </p><pre class="programlisting"><class name="eg.Node"> <id name="id" column="id"/> .... <bag name="accessibleTo" table="node_access" lazy="true"> <key column="to_node_id"/> <many-to-many class="eg.Node" column="from_node_id"/> </bag> <!-- inverse end --> <bag name="accessibleFrom" table="node_access" inverse="true" lazy="true"> <key column="from_node_id"/> <many-to-many class="eg.Node" column="to_node_id"/> </bag></class></pre><p> 如果只对关联的反向端进行了改变,这个改变<span class="emphasis"><em>不会</em></span>被持久化。 (原文:Changes made only to the inverse end of the association are <span class="emphasis"><em>not</em></span> persisted.) </p><p> 要建立一个一对多的双向关联,你可以通过把一个一对多关联,作为一个多对一关联映射到到同一张表的字段上,并且在"多"的那一端定义<tt class="literal">inverse="true"</tt>。 (原文: You may map a bidirectional one-to-many association by mapping a one-to-many association to the same table column(s) as a many-to-one association and declaring the many-valued end <tt class="literal">inverse="true"</tt>.) </p><pre class="programlisting"><class name="eg.Parent"> <id name="id" column="id"/> .... <set name="children" inverse="true" lazy="true"> <key column="parent_id"/> <one-to-many class="eg.Child"/> </set></class><class name="eg.Child"> <id name="id" column="id"/> .... <many-to-one name="parent" class="eg.Parent" column="parent_id"/></class></pre><p> 在“一”这一端定义<tt class="literal">inverse="true"</tt>不会影响级联操作。 (原文:Mapping one end of an association with <tt class="literal">inverse="true"</tt> doesn't affect the operation of cascades.) </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-s1-11a"></a>6.10. 三重关联(Ternary Associations)</h2></div></div><div></div></div><p> 这里有两种可能的途径来映射一个三重关联。其中一个是使用组合元素(下面将讨论).另外一个是使用一个map,并且带有关联作为其索引。 </p><pre class="programlisting"><map name="contracts" lazy="true"> <key column="employer_id"/>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -